Generating Random Numbers/de: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Generating Random Numbers/de
| Old | New | Line | |
|---|---|---|---|
| 1 | + |  **Zufallszahlen** sind wichtige Quellen für wissenschaftliche Anwendungen, Bildung, Visualisierung und die Entwicklung von Spielen. Sie nehmen eine Schlüsselrolle in der Computersimulation ein. | |
| 2 | + | ||
| 3 | + | Algorithmisch erzeugte Zufallszahlen sind eigentlich Pseudozufallszahlen. Sie gehören zu einer (großen) Menge sich wiederholender Zahlen, deren Reihenfolge schwer und praktisch unmöglich vorhergesagt werden kann. Im Gegensatz zu Delphi verwendet Free Pascal einen MersenneTwister-Algorithmus für seine Standard-[[doc:rtl/system/random.html|random]]-Funktion der [[RTL/de|RTL]]. Vor der ersten Benutzung muss der Zufallszahlengenerator mit einem einmaligen Aufruf der Funktion [[doc:rtl/system/randomize.html|randomize]] initialisiert werden. Dies setzt den "Seed"-Werte des Generators. Vorzugsweise wird `randomize` zu Beginn der Programmausführung aufgerufen. | |
| 4 | + | ||
| 5 | + | Alternativ stehen auf Unix- und Linux-basierten Systemen die virtuellen Geräte [[Dev random|/dev/random]] und `/dev/urandom` zur Verfügung. Sie erzeugen Zufallszahlen auf Hardware-Basis. | |
| 6 | + | ||
| 7 | + | Eine dritte Möglichkeit besteht darin, Zufallszahlen aus externen Quellen zu verwenden, entweder von spezialisierter Hardware oder von öffentlichen Quellen, z. B. auf der Basis radioaktiver Zerfallsdaten. | |
| 8 | + | ||
| 9 | + | ## Gleichverteilung | |
| 10 | + | ||
| 11 | + | Die stetige Gleichverteilung (auch Rechteckverteilung oder Uniformverteilung) stellt eine Familie symmetrischer Wahrscheinlichkeitsverteilungen dar. Innerhalb eines definierten Intervalls hat sie eine konstante Wahrscheinlichkeitsdichte. | |
| 12 | + | ||
| 13 | + | Die Standardfunktion [[doc:rtl/system/random.html|random]] der [[RTL/de|RTL]] erzeugt Zufallszahlen, die eine Gleichverteilung zu erfüllen. Wenn sie ohne Parameter aufgerufen wird, dann liefert `random` Fließkomma-Zufallszahlen aus dem Intervall \[0, 1), d. h. 0 \<= Ergebnis \< 1. Wenn `random` dagegen mit einem longint-Argument L aufgerufen wird. liefert sie eine longint-Zufallszahl des Intervalls \[0, L). | |
| 14 | + | ||
| 15 | + | Gleichverteilte Zufallszahlen sind nicht für jede Anwendung sinnvoll. Um Zufallszahlen mit einer anderen Verteilung zu erstellen, sind spezielle Algorithmen notwendig: | |
| 16 | + | ||
| 17 | + | ## Normalverteilung (Gaußsche Verteilung) | |
| 18 | + | ||
| 19 | + | Unter den verschiedenen Algorithmen zur Erzeugung normalverteilter Zufallszahlen ist das [Box-Müller-Verfahren](http://en.wikipedia.org/wiki/Box–Muller_transform) das effizienteste. Die folgende Funktion berechnet damit Gauß-verteilte Zufallszahlen: | |
| 20 | + | ||
| 21 | + | ``` pascal | |
| 22 | + | function rnorm (mean, sd: real): real; | |
| 23 | + | {Berechnet Gaußsche Zufallszahlen nach dem Box-Müller-Verfahren} | |
| 24 | + | var | |
| 25 | + | u1, u2: real; | |
| 26 | + | begin | |
| 27 | + | u1 := random; | |
| 28 | + | u2 := random; | |
| 29 | + | rnorm := mean * abs(1 + sqrt(-2 * (ln(u1))) * cos(2 * pi * u2) * sd); | |
| 30 | + | end; | |
| 31 | + | ``` | |
| 32 | + | ||
| 33 | + | Der gleiche Algorithmus wird von der Funktion [[doc:rtl/math/randg.html|randg]] aus der RTL unit [[doc:rtl/math/index.html|math]] verwendet: | |
| 34 | + | ||
| 35 | + | ``` pascal | |
| 36 | + | function randg(mean,stddev: float): float; | |
| 37 | + | ``` | |
| 38 | + | ||
| 39 | + | ## Exponentialverteilung | |
| 40 | + | ||
| 41 | + | Eine Exponentialverteilung tritt häufig bei praktischen Problemen auf. Ein klassisches Beispiel ist die Verteilung der Wartezeiten zwischen unabhängigen Poisson-Zufallsereignissen, wie z. B. der radioaktive Zerfall von Atomkernen \[Press et al. 1989\]. | |
| 42 | + | ||
| 43 | + | Die folgende Funktion liefert eine einzige Zufallszahl aus einer Exponentialverteilung. Der zu übergebende Wert `rate` ist der Kehrwert des Mittelwertes, und die Konstante `RESOLUTION` bestimmt die Granularität der erzeugten Zufallszahlen. | |
| 44 | + | ||
| 45 | + | ``` pascal | |
| 46 | + | function randomExp(a, rate: real): real; | |
| 47 | + | const | |
| 48 | + | RESOLUTION = 1000; | |
| 49 | + | var | |
| 50 | + | unif: real; | |
| 51 | + | begin | |
| 52 | + | if rate = 0 then | |
| 53 | + | randomExp := NaN | |
| 54 | + | else | |
| 55 | + | begin | |
| 56 | + | repeat | |
| 57 | + | unif := random(RESOLUTION) / RESOLUTION; | |
| 58 | + | until unif <> 0; | |
| 59 | + | randomExp := a - rate * ln(unif); | |
| 60 | + | end; | |
| 61 | + | end; | |
| 62 | + | ``` | |
| 63 | + | ||
| 64 | + | ## Gamma-Verteilung | |
| 65 | + | ||
| 66 | + | Die Gammaverteilung ist eine kontinuierliche Wahrscheinlichkeitsverteilung über der Menge der positiven reellen Zahlen. Sie ist eine Verallgemeinerung sowohl der Exponentialverteilung als auch der Erlang-Verteilung. Sie wird zum Beispiel in der Warteschlangentheorie und in der Versicherungsmathematik verwendet. | |
| 67 | + | ||
| 68 | + | Die folgende Funktion liefert eine einzige echte Zufallszahl aus einer Gamma-Verteilung. Die Form der Verteilung wird durch die Parameter *a*, *b* und *c* definiert. Die Funktion nutzt die oben definierte Funktion randomExp. | |
| 69 | + | ||
| 70 | + | ``` pascal | |
| 71 | + | function randomGamma(a, b, c: real): real; | |
| 72 | + | const | |
| 73 | + | RESOLUTION = 1000; | |
| 74 | + | T = 4.5; | |
| 75 | + | D = 1 + ln(T); | |
| 76 | + | var | |
| 77 | + | unif: real; | |
| 78 | + | A2, B2, C2, Q, p, y: real; | |
| 79 | + | p1, p2, v, w, z: real; | |
| 80 | + | found: boolean; | |
| 81 | + | begin | |
| 82 | + | A2 := 1 / sqrt(2 * c - 1); | |
| 83 | + | B2 := c - ln(4); | |
| 84 | + | Q := c + 1 / A2; | |
| 85 | + | C2 := 1 + c / exp(1); | |
| 86 | + | found := False; | |
| 87 | + | if c < 1 then | |
| 88 | + | begin | |
| 89 | + | repeat | |
| 90 | + | repeat | |
| 91 | + | unif := random(RESOLUTION) / RESOLUTION; | |
| 92 | + | until unif > 0; | |
| 93 | + | p := C2 * unif; | |
| 94 | + | if p > 1 then | |
| 95 | + | begin | |
| 96 | + | repeat | |
| 97 | + | unif := random(RESOLUTION) / RESOLUTION; | |
| 98 | + | until unif > 0; | |
| 99 | + | y := -ln((C2 - p) / c); | |
| 100 | + | if unif <= power(y, c - 1) then | |
| 101 | + | begin | |
| 102 | + | randomGamma := a + b * y; | |
| 103 | + | found := True; | |
| 104 | + | end; | |
| 105 | + | end | |
| 106 | + | else | |
| 107 | + | begin | |
| 108 | + | y := power(p, 1 / c); | |
| 109 | + | if unif <= exp(-y) then | |
| 110 | + | begin | |
| 111 | + | randomGamma := a + b * y; | |
| 112 | + | found := True; | |
| 113 | + | end; | |
| 114 | + | end; | |
| 115 | + | until found; | |
| 116 | + | end | |
| 117 | + | else if c = 1 then | |
| 118 | + | { Die Gamma-Verteilung wird zur Exponentialverteilung, if c = 1 } | |
| 119 | + | begin | |
| 120 | + | randomGamma := randomExp(a, b); | |
| 121 | + | end | |
| 122 | + | else | |
| 123 | + | begin | |
| 124 | + | repeat | |
| 125 | + | repeat | |
| 126 | + | p1 := random(RESOLUTION) / RESOLUTION; | |
| 127 | + | until p1 > 0; | |
| 128 | + | repeat | |
| 129 | + | p2 := random(RESOLUTION) / RESOLUTION; | |
| 130 | + | until p2 > 0; | |
| 131 | + | v := A2 * ln(p1 / (1 - p1)); | |
| 132 | + | y := c * exp(v); | |
| 133 | + | z := p1 * p1 * p2; | |
| 134 | + | w := B2 + Q * v - y; | |
| 135 | + | if (w + D - T * z >= 0) or (w >= ln(z)) then | |
| 136 | + | begin | |
| 137 | + | randomGamma := a + b * y; | |
| 138 | + | found := True; | |
| 139 | + | end; | |
| 140 | + | until found; | |
| 141 | + | end; | |
| 142 | + | end; | |
| 143 | + | ``` | |
| 144 | + | ||
| 145 | + | ## Erlang-Verteilung | |
| 146 | + | ||
| 147 | + | Die Erlang-Verteilung ist eine stetige Wahrscheinlichkeitsverteilung, eine Verallgemeinerung der Exponentialverteilung und ein Spezialfall der Gamma-Verteilung. Sie wurde von Agner Krarup Erlang für die statistische Modellierung der Intervall-Längen zwischen Telefonanrufen entwickelt. | |
| 148 | + | ||
| 149 | + | Die Erlang Verteilung wird für die Warteschlangentheorie und zur Simulation von Wartezeiten verwendet. | |
| 150 | + | ||
| 151 | + | ``` pascal | |
| 152 | + | function randomErlang(mean: real; k: integer): real; | |
| 153 | + | const | |
| 154 | + | RESOLUTION = 1000; | |
| 155 | + | var | |
| 156 | + | i: integer; | |
| 157 | + | unif, prod: real; | |
| 158 | + | begin | |
| 159 | + | if (mean <= 0) or (k < 1) then | |
| 160 | + | randomErlang := NaN | |
| 161 | + | else | |
| 162 | + | begin | |
| 163 | + | prod := 1; | |
| 164 | + | for i := 1 to k do | |
| 165 | + | begin | |
| 166 | + | repeat | |
| 167 | + | unif := random(RESOLUTION) / RESOLUTION; | |
| 168 | + | until unif <> 0; | |
| 169 | + | prod := prod * unif; | |
| 170 | + | end; | |
| 171 | + | randomErlang := -mean * ln(prod); | |
| 172 | + | end; | |
| 173 | + | end; | |
| 174 | + | ``` | |
| 175 | + | ||
| 176 | + | ## Poisson-Verteilung | |
| 177 | + | ||
| 178 | + | Die Poisson-Verteilung umfasst ganzzahlige Werte. Sie spiegelt die Wahrscheinlichkeit für *k* Erfolge wieder, wenn die Wahrscheinlichkeit eines Erfolgs in jedem Versuch klein und die Auftretensrate (der Mittelwert) konstant ist. | |
| 179 | + | ||
| 180 | + | ``` pascal | |
| 181 | + | function randomPoisson(mean: integer): integer; | |
| 182 | + | { Generator for Poisson distribution (Donald Knuth's algorithm) } | |
| 183 | + | const | |
| 184 | + | RESOLUTION = 1000; | |
| 185 | + | var | |
| 186 | + | k: integer; | |
| 187 | + | b, l: real; | |
| 188 | + | begin | |
| 189 | + | assert(mean > 0, 'mean < 1'); | |
| 190 | + | k := 0; | |
| 191 | + | b := 1; | |
| 192 | + | l := exp(-mean); | |
| 193 | + | while b > l do | |
| 194 | + | begin | |
| 195 | + | k := k + 1; | |
| 196 | + | b := b * random(RESOLUTION) / RESOLUTION; | |
| 197 | + | end; | |
| 198 | + | randomPoisson := k - 1; | |
| 199 | + | end; | |
| 200 | + | ``` | |
| 201 | + | ||
| 202 | + | ## t-Verteilung | |
| 203 | + | ||
| 204 | + | Die t-Verteilung wird auch Student-t-Verteilung bezeichnet, da sie von William Sealy Gosset 1908 unter dem Pseudonym *Student* veröffentlicht wurde. Die t-Verteilung ist eine kontinuierliche Wahrscheinlichkeitsverteilung. Ihre Form ist definiert durch einen Parameter, die Anzahl der Freiheitsgrade (df). | |
| 205 | + | ||
| 206 | + | In der Statistik sind viele Schätzwerte t-verteilt. Die t-Verteilung spielt daher eine wichtige Rolle bei etlichen statistischen Analysen, beispielsweise für den t-Test zur Berechnung der statistischen Signifikanz des Unterschieds zwischen zwei empirischen Mittelwerten, die Konstruktion von Konfidenzintervallen für die Differenz zweier populationsbasierter Mittelwerte und in der linearen Regression. Die t-Verteilung kommt auch in der Bayesschen Analyse normalverteilter Daten vor. | |
| 207 | + | ||
| 208 | + | Der folgende Algorithmus basiert auf der [[RTL/de|RTL]] Funktion [[doc:rtl/system/random.html|random]] und der Funktion randomChisq. | |
| 209 | + | ||
| 210 | + | ``` pascal | |
| 211 | + | function randomT(df: integer): real; | |
| 212 | + | { Generator für die studentsche t-Verteilung } | |
| 213 | + | begin | |
| 214 | + | if df < 1 then randomT := NaN | |
| 215 | + | else | |
| 216 | + | begin | |
| 217 | + | randomT := randg(0, 1) / sqrt(randomChisq(df) / df); | |
| 218 | + | end; | |
| 219 | + | end; | |
| 220 | + | ``` | |
| 221 | + | ||
| 222 | + | ## Chi-Quadrat-Verteilung | |
| 223 | + | ||
| 224 | + | Die Chi-Quadrat-Verteilung ist eine stetige Wahrscheinlichkeitsverteilung über der Menge der positiven reellen Zahlen. Sie ist die Verteilung der Quadratsummen *df* unabhängiger standardnormalverteilter Variablen und hat daher *df* Freiheitsgrade. Die Chi-Quadrat-Verteilung wird vielfach in der schließenden Statistik verwendet, z. B. für die Schätzung von Varianzen und für Chi-Quadrat Tests. Sie besitzt eine spezielle Gammaverteilung mit *c* = *df* / 2 und *b* = 2. Daher ist die folgende Funktion abhängig von der Funktion randomGamma. | |
| 225 | + | ||
| 226 | + | ``` pascal | |
| 227 | + | function randomChisq(df: integer): real; | |
| 228 | + | begin | |
| 229 | + | if df < 1 then randomChisq := NaN | |
| 230 | + | else | |
| 231 | + | randomChisq := randomGamma(0, 2, 0.5 * df); | |
| 232 | + | end; | |
| 233 | + | ``` | |
| 234 | + | ||
| 235 | + | ## F-Verteilung oder Fisher-Verteilung | |
| 236 | + | ||
| 237 | + | Die F-Verteilung, die auch als Fisher-Snedecor Verteilung bezeichnet wird, ist eine kontinuierliche Wahrscheinlichkeitsverteilung. Sie wird für F-Tests und Varianzanalysne (ANOVA von englisch *analysis of variance*) verwendet. Die F-Verteilung verfügt über zwei Freiheitsgrade, die als Parameter *v* und *w* bezeichnet werden. Diese Parameter sind positive ganze Zahlen. Die folgende Funktion **randomF** verwendet die Funktion randomChisq. | |
| 238 | + | ||
| 239 | + | ``` pascal | |
| 240 | + | function randomF(v, w: integer): real; | |
| 241 | + | begin | |
| 242 | + | if (v < 1) or (w < 1) then | |
| 243 | + | randomF := NaN | |
| 244 | + | else | |
| 245 | + | randomF := randomChisq(v) / v / (randomChisq(w) / w); | |
| 246 | + | end; | |
| 247 | + | ``` | |
| 248 | + | ||
| 249 | + | ## Siehe auch | |
| 250 | + | ||
| 251 | + | - [[Dev random/de|Dev random]] | |
| 252 | + | - [[Functions for descriptive statistics]] | |
| 253 | + | ||
| 254 | + | ## Literatur | |
| 255 | + | ||
| 256 | + | 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) | |
| 257 | + | 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. | |
| 258 | + | 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. | |
| 259 | + | 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. | |
| 260 | + | 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 | |
| 261 | + | 6. Christian Walck, Hand-book on STATISTICAL DISTRIBUTIONS for experimentalists, Internal Report SUF–PFY/96–01, University of Stockholm 2007 | |
| 262 | + | ||
| 263 | + | --- | |
| 264 | + | *From the Free Pascal wiki, page "Generating Random Numbers/de", as it stood on 2020-08-09 after a change by Trev, 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).* |
