Sign in Join
Wiki copytemporary

Generating Random Numbers/fi: what changed

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

Title: Generating Random Numbers/fi

OldNewLine
1+# Satunnaisluvut
2+
3+<figure>
4+<img src="fpc_source_logo.png" title="fpc_source_logo.png" />
5+<figcaption>fpc_source_logo.png</figcaption>
6+</figure>
7+
8+**Satunnaisluvut** ovat tärkeitä resursseja tieteellisiin sovelluksiin, koulutuksessa, pelien kehityksessä ja visualisoinnissa. Niillä on myös keskeinen rooli numeerisessa simuloinnissa.
9+
10+Algoritmilla 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.
11+
12+Vaihtoehtoisesti 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.
13+
14+Kolmas vaihtoehto on käyttää satunnaislukuja ulkoisista lähteistä, joko siihen erikoistuneista laitteista tai julkisista lähteistä, esimerkiksi perustuen radioaktiivisen hajoamisen tietoihin.
15+
16+## Tasainen jakauma
17+
18+Jatkuvan 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.
19+
20+Vakio [[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) .
21+
22+Tasaisesti jakautunut satunnaisluvut eivät ole käyttökelpoisia kaikkiin käyttökohteisiin. Jotta saadaan satunnaislukuja muilla jakaumilla ovat erikoisalgoritmit ovat tarpeen:
23+
24+## Normaali (Gaussian) jakauma
25+
26+Yksi 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:
27+
28+``` pascal
29+ function rnorm (mean, sd: real): real;
30+ {Laskee normaalin Gaussin satunnaislukuja Box-Müller lähestymistavan mukaisesti}
31+ var
32+ u1, u2: real;
33+ begin
34+ u1 := random;
35+ u2 := random;
36+ rnorm := mean * abs(1 + sqrt(-2 * (ln(u1))) * cos(2 * pi * u2) * sd);
37+ end;
38+```
39+
40+Samaa algoritmia käyttää funktio [[doc:rtl/math/randg.html|randg]] RTL:n [[doc:rtl/math/index.html|math]] käännösyksikössä:
41+
42+``` pascal
43+function randg(mean,stddev: float): float;
44+```
45+
46+## Eksponentiaalinen jakauma
47+
48+Eksponentiaalinen jakauma esiintyy usein reaalimaailman ongelmissa. Klassinen esimerkki on jakauma odotusaikojen välillä riippumattomien Poisson-satunnaisia ​​tapahtumia, kuten radioaktiivinen ytimen hajoaminen \[Press et al. 1989\].
49+
50+Seuraava toiminto tarjoaa yhden todellisen satunnaisluvun ulos eksponentiaalisen jakauman mukaisesti. *Rate* on käänteinen keskiarvo ja vakio *RESOLUTION* määrittää "karkeuuden" kun generoidaan satunnaisia numeroita.
51+
52+``` pascal
53+function randomExp(a, rate: real): real;
54+const
55+ RESOLUTION = 1000;
56+var
57+ unif: real;
58+begin
59+ if rate = 0 then
60+ randomExp := NaN
61+ else
62+ begin
63+ repeat
64+ unif := random(RESOLUTION) / RESOLUTION;
65+ until unif <> 0;
66+ randomExp := a - rate * ln(unif);
67+ end;
68+end;
69+```
70+
71+## Gamma jakauma
72+
73+Gamma 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.
74+
75+Seuraava 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.
76+
77+``` pascal
78+function randomGamma(a, b, c: real): real;
79+const
80+ RESOLUTION = 1000;
81+ T = 4.5;
82+ D = 1 + ln(T);
83+var
84+ unif: real;
85+ A2, B2, C2, Q, p, y: real;
86+ p1, p2, v, w, z: real;
87+ found: boolean;
88+begin
89+ A2 := 1 / sqrt(2 * c - 1);
90+ B2 := c - ln(4);
91+ Q := c + 1 / A2;
92+ C2 := 1 + c / exp(1);
93+ found := False;
94+ if c < 1 then
95+ begin
96+ repeat
97+ repeat
98+ unif := random(RESOLUTION) / RESOLUTION;
99+ until unif > 0;
100+ p := C2 * unif;
101+ if p > 1 then
102+ begin
103+ repeat
104+ unif := random(RESOLUTION) / RESOLUTION;
105+ until unif > 0;
106+ y := -ln((C2 - p) / c);
107+ if unif <= power(y, c - 1) then
108+ begin
109+ randomGamma := a + b * y;
110+ found := True;
111+ end;
112+ end
113+ else
114+ begin
115+ y := power(p, 1 / c);
116+ if unif <= exp(-y) then
117+ begin
118+ randomGamma := a + b * y;
119+ found := True;
120+ end;
121+ end;
122+ until found;
123+ end
124+ else if c = 1 then
125+ { Gamma jakauma muuttuu eksponenttijakaumaksi, jos c = 1}
126+ begin
127+ randomGamma := randomExp(a, b);
128+ end
129+ else
130+ begin
131+ repeat
132+ repeat
133+ p1 := random(RESOLUTION) / RESOLUTION;
134+ until p1 > 0;
135+ repeat
136+ p2 := random(RESOLUTION) / RESOLUTION;
137+ until p2 > 0;
138+ v := A2 * ln(p1 / (1 - p1));
139+ y := c * exp(v);
140+ z := p1 * p1 * p2;
141+ w := B2 + Q * v - y;
142+ if (w + D - T * z >= 0) or (w >= ln(z)) then
143+ begin
144+ randomGamma := a + b * y;
145+ found := True;
146+ end;
147+ until found;
148+ end;
149+end;
150+```
151+
152+## Erlang jakauma
153+
154+Erlang 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.
155+
156+``` pascal
157+ function randomErlang(mean: real; k: integer): real;
158+ const
159+ RESOLUTION = 1000;
160+ var
161+ i: integer;
162+ unif, prod: real;
163+ begin
164+ if (mean <= 0) or (k < 1) then
165+ randomErlang := NaN
166+ else
167+ begin
168+ prod := 1;
169+ for i := 1 to k do
170+ begin
171+ repeat
172+ unif := random(RESOLUTION) / RESOLUTION;
173+ until unif <> 0;
174+ prod := prod * unif;
175+ end;
176+ randomErlang := -mean * ln(prod);
177+ end;
178+ end;
179+```
180+
181+## Poissonin jakauma
182+
183+Poissonin jakauman koskee kokonaislukuja. Se edustaa *k* onnistumisen todennäköisyyttä, kun todennäköisyyden menestys kussakin kokeessa on pieni ja esiintymistiheys (keskiarvo) on vakio.
184+
185+``` pascal
186+function randomPoisson(mean: integer): integer;
187+{ Generaatori Poissonin jakaumalle (Donald Knuth algoritmi) }
188+const
189+ RESOLUTION = 1000;
190+var
191+ k: integer;
192+ b, l: real;
193+begin
194+ assert(mean > 0, 'mean < 1');
195+ k := 0;
196+ b := 1;
197+ l := exp(-mean);
198+ while b > l do
199+ begin
200+ k := k + 1;
201+ b := b * random(RESOLUTION) / RESOLUTION;
202+ end;
203+ randomPoisson := k - 1;
204+end;
205+```
206+
207+## Studentin t-jakauma
208+
209+T-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.
210+
211+Seuraava algoritmi riippuu [[RTL]]:n funktiosta [[doc:rtl/system/random.html|random]] ja **randomChisq** funktiosta
212+
213+``` pascal
214+function randomT(df: integer): real;
215+{ Generaattori Student's t jakaumalle }
216+begin
217+ if df < 1 then randomT := NaN
218+ else
219+ begin
220+ randomT := randg(0, 1) / sqrt(randomChisq(df) / df);
221+ end;
222+end;
223+```
224+
225+## Khii toiseen -jakauma
226+
227+Khii 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**.
228+
229+``` pascal
230+function randomChisq(df: integer): real;
231+begin
232+ if df < 1 then randomChisq := NaN
233+ else
234+ randomChisq := randomGamma(0, 2, 0.5 * df);
235+end;
236+```
237+
238+## F-jakauma
239+
240+F-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**.
241+
242+``` pascal
243+function randomF(v, w: integer): real;
244+begin
245+ if (v < 1) or (w < 1) then
246+ randomF := NaN
247+ else
248+ randomF := randomChisq(v) / v / (randomChisq(w) / w);
249+end;
250+```
251+
252+## Katso myös
253+
254+- [[Dev random]]
255+- [[Functions for descriptive statistics]]
256+- [[Marsaglia&|Marsaglia's pseudo random number generators]]
257+- [[Delphi compatible LCG Random]]
258+
259+## Viitteet
260+
261+1. [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)
262+2. 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.
263+3. 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.
264+4. 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.
265+5. 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
266+6. Christian Walck, Hand-book on STATISTICAL DISTRIBUTIONS for experimentalists, Internal Report SUF–PFY/96–01, University of Stockholm 2007
267+
268+\
269+
270+---
271+*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