Sign in Join
Wiki copytemporary

Generating Random Numbers/fi: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11# Satunnaisluvut
22
3-<figure>
4-<img src="fpc_source_logo.png" title="fpc_source_logo.png" />
5-<figcaption>fpc_source_logo.png</figcaption>
6-</figure>
3+![](/wiki-images/8/84/Fpc_source_logo.png)
74
85**Satunnaisluvut** ovat tärkeitä resursseja tieteellisiin sovelluksiin, koulutuksessa, pelien kehityksessä ja visualisoinnissa. Niillä on myös keskeinen rooli numeerisessa simuloinnissa.
96
107Algoritmilla luodut satunnaisluvut ovat pseudo-satunnaisia lukuja. Ne kuuluvat (suureen) joukkoon toistuvia numeroita, jonka sekvenssi on mahdotonta tai ainakin vaikeaa ennustaa. Toisin Delphi, joka käyttää lineaarista congruential generaattoria niin Free Pascal käyttää [[A simple implementation of the Mersenne twister|MersenneTwister]] algoritmia sen vakio [[doc:rtl/system/random.html|random]] toimintaan joka on määritelty [[RTL]]:ssä. Ennen ensimmäistä käyttöä, FPC: n satunnaislukugeneraattori on alustettava yhdellä [[doc:rtl/system/randomize.html|randomize]] funktiokutsulla, joka asettaa siemengeneraattorin. Tämä tehdään ohjelman käynnistysvaiheessa.
118
129Vaihtoehtoisesti Unix- ja Linux-pohjaisissa järjestelmissä on virtuaaliset laitteet [[Dev random|/dev/random]] ja `/dev/urandom` ovat käytettävissä. Ne tuottavat (pseudo) satunnaislukuja perustuen laitteistoon.
1310
1411Kolmas vaihtoehto on käyttää satunnaislukuja ulkoisista lähteistä, joko siihen erikoistuneista laitteista tai julkisista lähteistä, esimerkiksi perustuen radioaktiivisen hajoamisen tietoihin.
1512
1613## Tasainen jakauma
1714
1815Jatkuvan tasaisen jakauman satunnaisluvut(kutsutaan myös uniform distribution ja rectangular distribution) edustaa symmetrisen jakauman perhettä. Tässä jokaisen satunnaisluvun esiintyminen on koko alueella ovat yhtä todennäköisiä kuin jonkun muun.
1916
2017Vakio [[RTL]]:n funktio [[doc:rtl/system/random.html|random]] generoi satunnaislukuja, jotka täyttävät tasaisen satunnaislukujen jakautumisen. Jos sitä on kutsuttu ilman parametria niin `random` tarjoaa pseudosatunnaisen liukuluvun väliltä 0..1, eli 0 \<= result \<1. Jos `random` kutsutaan longint parametrillä L se antaa longint-tyyppisen satunnaisen kokonaisluvun välillä 0.. (L-1) .
2118
2219Tasaisesti jakautunut satunnaisluvut eivät ole käyttökelpoisia kaikkiin käyttökohteisiin. Jotta saadaan satunnaislukuja muilla jakaumilla ovat erikoisalgoritmit ovat tarpeen:
2320
2421## Normaali (Gaussian) jakauma
2522
2623Yksi yleisempiä algoritmeja tuottaa normaali Gaussin jakauman satunnaislukuja, tasaisen jakautuman satunnaisluvuista on [Box-Müller lähestymistapa](http://en.wikipedia.org/wiki/Box–Muller_transform) . Seuraava funktio laskee normaalin Gauss-jakauman satunnaislukuja:
2724
2825``` pascal
2926 function rnorm (mean, sd: real): real;
3027 {Laskee normaalin Gaussin satunnaislukuja Box-Müller lähestymistavan mukaisesti}
3128 var
3229 u1, u2: real;
3330 begin
3431 u1 := random;
3532 u2 := random;
3633 rnorm := mean * abs(1 + sqrt(-2 * (ln(u1))) * cos(2 * pi * u2) * sd);
3734 end;
3835```
3936
4037Samaa algoritmia käyttää funktio [[doc:rtl/math/randg.html|randg]] RTL:n [[doc:rtl/math/index.html|math]] käännösyksikössä:
4138
4239``` pascal
4340function randg(mean,stddev: float): float;
4441```
4542
4643## Eksponentiaalinen jakauma
4744
4845Eksponentiaalinen jakauma esiintyy usein reaalimaailman ongelmissa. Klassinen esimerkki on jakauma odotusaikojen välillä riippumattomien Poisson-satunnaisia ​​tapahtumia, kuten radioaktiivinen ytimen hajoaminen \[Press et al. 1989\].
4946
5047Seuraava toiminto tarjoaa yhden todellisen satunnaisluvun ulos eksponentiaalisen jakauman mukaisesti. *Rate* on käänteinen keskiarvo ja vakio *RESOLUTION* määrittää "karkeuuden" kun generoidaan satunnaisia numeroita.
5148
5249``` pascal
5350function randomExp(a, rate: real): real;
5451const
5552 RESOLUTION = 1000;
5653var
5754 unif: real;
5855begin
5956 if rate = 0 then
6057 randomExp := NaN
6158 else
6259 begin
6360 repeat
6461 unif := random(RESOLUTION) / RESOLUTION;
6562 until unif <> 0;
6663 randomExp := a - rate * ln(unif);
6764 end;
6865end;
6966```
7067
7168## Gamma jakauma
7269
7370Gamma jakauma on kaksi parametrinen ja kuuluu jatkuvan satunnaisen jakauman ryhmään. Se on yleistys sekä eksponentiaalijakaumasta että Erlang jakaumasta. Mahdollisia gammajakauman sovelluksia ovat mallintaminen ja simulointi jonot tai jonot ja vakuutusmatematiikka.
7471
7572Seuraava funktio tarjoaa yhden todellisen gammajakauman satunnaisluvun. Jakauman muoto määritetään parametreillä *a*, *b* ja *c*. Funktio käyttää funktiota **randomExp** joka on edellä määritelty.
7673
7774``` pascal
7875function randomGamma(a, b, c: real): real;
7976const
8077 RESOLUTION = 1000;
8178 T = 4.5;
8279 D = 1 + ln(T);
8380var
8481 unif: real;
8582 A2, B2, C2, Q, p, y: real;
8683 p1, p2, v, w, z: real;
8784 found: boolean;
8885begin
8986 A2 := 1 / sqrt(2 * c - 1);
9087 B2 := c - ln(4);
9188 Q := c + 1 / A2;
9289 C2 := 1 + c / exp(1);
9390 found := False;
9491 if c < 1 then
9592 begin
9693 repeat
9794 repeat
9895 unif := random(RESOLUTION) / RESOLUTION;
9996 until unif > 0;
10097 p := C2 * unif;
10198 if p > 1 then
10299 begin
103100 repeat
104101 unif := random(RESOLUTION) / RESOLUTION;
105102 until unif > 0;
106103 y := -ln((C2 - p) / c);
107104 if unif <= power(y, c - 1) then
108105 begin
109106 randomGamma := a + b * y;
110107 found := True;
111108 end;
112109 end
113110 else
114111 begin
115112 y := power(p, 1 / c);
116113 if unif <= exp(-y) then
117114 begin
118115 randomGamma := a + b * y;
119116 found := True;
120117 end;
121118 end;
122119 until found;
123120 end
124121 else if c = 1 then
125122 { Gamma jakauma muuttuu eksponenttijakaumaksi, jos c = 1}
126123 begin
127124 randomGamma := randomExp(a, b);
128125 end
129126 else
130127 begin
131128 repeat
132129 repeat
133130 p1 := random(RESOLUTION) / RESOLUTION;
134131 until p1 > 0;
135132 repeat
136133 p2 := random(RESOLUTION) / RESOLUTION;
137134 until p2 > 0;
138135 v := A2 * ln(p1 / (1 - p1));
139136 y := c * exp(v);
140137 z := p1 * p1 * p2;
141138 w := B2 + Q * v - y;
142139 if (w + D - T * z >= 0) or (w >= ln(z)) then
143140 begin
144141 randomGamma := a + b * y;
145142 found := True;
146143 end;
147144 until found;
148145 end;
149146end;
150147```
151148
152149## Erlang jakauma
153150
154151Erlang jakauma on kaksi parametrinen ja kuuluu jatkuvan satunnaisen jakauman ryhmään. Se on yleistys eksponentiaalijakaumasta ja erikoistapaus gammajakaumasta, missä *c* on kokonaisluku. Erlang jakauman on ensin kuvannut Agner Krarup Erlang jolla mallintaa puhelimen soittojen välistä aikaa. Sitä käytetään jonoteoriassa ja simuloidaan jonoja.
155152
156153``` pascal
157154 function randomErlang(mean: real; k: integer): real;
158155 const
159156 RESOLUTION = 1000;
160157 var
161158 i: integer;
162159 unif, prod: real;
163160 begin
164161 if (mean <= 0) or (k < 1) then
165162 randomErlang := NaN
166163 else
167164 begin
168165 prod := 1;
169166 for i := 1 to k do
170167 begin
171168 repeat
172169 unif := random(RESOLUTION) / RESOLUTION;
173170 until unif <> 0;
174171 prod := prod * unif;
175172 end;
176173 randomErlang := -mean * ln(prod);
177174 end;
178175 end;
179176```
180177
181178## Poissonin jakauma
182179
183180Poissonin jakauman koskee kokonaislukuja. Se edustaa *k* onnistumisen todennäköisyyttä, kun todennäköisyyden menestys kussakin kokeessa on pieni ja esiintymistiheys (keskiarvo) on vakio.
184181
185182``` pascal
186183function randomPoisson(mean: integer): integer;
187184{ Generaatori Poissonin jakaumalle (Donald Knuth algoritmi) }
188185const
189186 RESOLUTION = 1000;
190187var
191188 k: integer;
192189 b, l: real;
193190begin
194191 assert(mean > 0, 'mean < 1');
195192 k := 0;
196193 b := 1;
197194 l := exp(-mean);
198195 while b > l do
199196 begin
200197 k := k + 1;
201198 b := b * random(RESOLUTION) / RESOLUTION;
202199 end;
203200 randomPoisson := k - 1;
204201end;
205202```
206203
207204## Studentin t-jakauma
208205
209206T-jakauma jota kutsutaan myös Studentin t-jakaumaksi, koska se julkaisi William Sealy Gosset vuonna 1908 salanimellä *Student* on jatkuva todennäköisyysjakauma. Sen muoto on määritelty yhdellä parametrilla, vapausasteella (*df*, degrees of freedom ). Tilastoissa monet estimaattorit ovat t-jakaumassa. Siksi Studentin t-jakauma on merkittävä rooli useissa laajalti käytetyissä tilastolliseissa analyyseissä, kuten Studentin t-testissä jossa arvioidaan tilastollista merkitystä kahden näytteen eron avulla, rakentaminen luottamusväli ero kahden populaation keskiarvojen ja lineaarista regressioanalyysiä. T-jakauma syntyy myös Bayesin kaavan tietojen analysointi normaalista.
210207
211208Seuraava algoritmi riippuu [[RTL]]:n funktiosta [[doc:rtl/system/random.html|random]] ja **randomChisq** funktiosta
212209
213210``` pascal
214211function randomT(df: integer): real;
215212{ Generaattori Student's t jakaumalle }
216213begin
217214 if df < 1 then randomT := NaN
218215 else
219216 begin
220217 randomT := randg(0, 1) / sqrt(randomChisq(df) / df);
221218 end;
222219end;
223220```
224221
225222## Khii toiseen -jakauma
226223
227224Khii toiseen -jakauma on jatkuva jakauma satunnaislukujen kanssa df vapausasteen. Se kuvaa riippumattomien normaalijakautuneiden muuttujien neliöiden summan käyttäytymistä Se on jakelu summa neliöiden DF riippumattoman standardin normaalia satunnaismuuttujia. is a continuous distribution of random numbers with *df* degrees of freedom. It is the distribution of a sum of the squares of *df* independent standard normal random variables. Khii toiseen -jakaumalla on lukuisia sovelluksia johdettu tilastoihin, esimerkiksi arvioitaessa varianssien ja khii toiseen testejä. Se on erikoistapaus Gamma jakaumasta jossa c = df / 2 ja b = 2. Siksi seuraava funktio riippuu funktiosta **randomGamma**.
228225
229226``` pascal
230227function randomChisq(df: integer): real;
231228begin
232229 if df < 1 then randomChisq := NaN
233230 else
234231 randomChisq := randomGamma(0, 2, 0.5 * df);
235232end;
236233```
237234
238235## F-jakauma
239236
240237F-jakauman, jota kutsutaan myös Fisher-Snedecor jakaumaksi, on jatkuva todennäköisyysjakauma. Sitä käytetään F-testissä ja ANOVA:ssa (Analysis of variance). Siinä on kaksi vapausastetta, jotka toimivat muotoparametreilla *v* ja *w* ja ne ovat positiivisia kokonaislukuja. Seuraava funktio **randomF** käyttää funktiota **randomChisq**.
241238
242239``` pascal
243240function randomF(v, w: integer): real;
244241begin
245242 if (v < 1) or (w < 1) then
246243 randomF := NaN
247244 else
248245 randomF := randomChisq(v) / v / (randomChisq(w) / w);
249246end;
250247```
251248
252249## Katso myös
253250
254251- [[Dev random]]
255252- [[Functions for descriptive statistics]]
256253- [[Marsaglia&|Marsaglia's pseudo random number generators]]
257254- [[Delphi compatible LCG Random]]
258255
259256## Viitteet
260257
2612581. [G. E. P. Box and Mervin E. Muller, *A Note on the Generation of Random Normal Deviates*, The Annals of Mathematical Statistics (1958), Vol. 29, No. 2 pp. 610–611](http://projecteuclid.org/DPubS/Repository/1.0/Disseminate?view=body&id=pdf_1&handle=euclid.aoms/1177706645)
2622592. Dietrich, J. W. (2002). [Der Hypophysen-Schilddrüsen-Regelkreis](http://openlibrary.org/books/OL24586469M/Der_Hypophysen-Schilddrüsen-Regelkreis). Berlin, Germany: Logos-Verlag Berlin. ISBN 978-3-89722-850-4. OCLC 50451543.
2632603. Press, W. H., B. P. Flannery, S. A. Teukolsky, W. T. Vetterling (1989). [Numerical Recipes in Pascal](http://openlibrary.org/works/OL16807779W/). The Art of Scientific Computing, Cambridge University Press, ISBN 0-521-37516-9.
2642614. Richard Saucier, [Computer Generation of Statistical Distributions](http://ftp.arl.mil/random/random.pdf), ARL-TR-2168, US Army Research Laboratory, Aberdeen Proving Ground, MD, 21005-5068, March 2000.
2652625. R.U. Seydel, Generating Random Numbers with Specified Distributions. In: Tools for Computational Finance, Universitext, [DOI 10.1007/978-1-4471-2993-6_2](http://dx.doi.org/10.1007/978-1-4471-2993-6_2), © Springer-Verlag London Limited 2012
2662636. Christian Walck, Hand-book on STATISTICAL DISTRIBUTIONS for experimentalists, Internal Report SUF–PFY/96–01, University of Stockholm 2007
267-
268-\
269264
270265---
271266*From the Free Pascal wiki, page "Generating Random Numbers/fi", as it stood on 2020-02-16 after a change by GAN, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history