Difference between revisions of "Generating Random Numbers/de"
Jwdietrich (talk | contribs) (Sprachlich überarbeitet und an das übliche statistische Vokabular angepasst.) |
Jwdietrich (talk | contribs) (War das eine Google-Übersetzung?) |
||
Line 2: | Line 2: | ||
[[Generating Random Numbers/de|'''{{#language:de}} (de)''']] | | [[Generating Random Numbers/de|'''{{#language:de}} (de)''']] | | ||
[[Generating Random Numbers|'''{{#language:en}} (en)''']] | [[Generating Random Numbers|'''{{#language:en}} (en)''']] | ||
− | </small | + | </small> |
− | + | ||
− | + | '''Zufallszahlen''' sind wichtige Quellen für wissenschaftliche Anwendungen, Bildung, Visualisierung und die Entwicklung von Spielen. Sie nehmen eine Schlüsselrolle in der Computersimulation ein. | |
− | + | ||
− | Die Standardfunktion <code> [[doc:rtl/system/random.html|random]] </code> der [[RTL/de|RTL]] erzeugt Zufallszahlen, die eine Gleichverteilung zu erfüllen. Gleichverteilte Zufallszahlen sind nicht für jede Anwendung sinnvoll. Um Zufallszahlen mit einer anderen Verteilung zu erstellen, sind spezielle Algorithmen notwendig. | + | Die Standardfunktion <code> [[doc:rtl/system/random.html|random]] </code> der [[RTL/de|RTL]] erzeugt Zufallszahlen, die eine Gleichverteilung zu erfüllen. Gleichverteilte Zufallszahlen sind nicht für jede Anwendung sinnvoll. Um Zufallszahlen mit einer anderen Verteilung zu erstellen, sind spezielle Algorithmen notwendig. |
− | + | ||
__TOC__ | __TOC__ | ||
− | + | ||
== Normalverteilung (Gaußsche Verteilung) == | == Normalverteilung (Gaußsche Verteilung) == | ||
− | Unter den verschiedenen Algorithmen zur Erzeugung normalverteilter Zufallszahlen ist das [http://en.wikipedia.org/wiki/Box–Muller_transform Box-Müller-Verfahren] das effizienteste. Die folgende Funktion berechnet damit Gauß-verteilte Zufallszahlen: | + | |
+ | Unter den verschiedenen Algorithmen zur Erzeugung normalverteilter Zufallszahlen ist das [http://en.wikipedia.org/wiki/Box–Muller_transform Box-Müller-Verfahren] das effizienteste. Die folgende Funktion berechnet damit Gauß-verteilte Zufallszahlen: | ||
+ | |||
<syntaxhighlight> | <syntaxhighlight> | ||
function rnorm (mean, sd: real): real; | function rnorm (mean, sd: real): real; | ||
Line 23: | Line 25: | ||
end; | end; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | Der gleiche Algorithmus wird von der Funktion [[doc:rtl/math/randg.html|randg]] aus der RTL unit [[doc:rtl/math/index.html|math]] verwendet: | + | Der gleiche Algorithmus wird von der Funktion [[doc:rtl/math/randg.html|randg]] aus der RTL unit [[doc:rtl/math/index.html|math]] verwendet: |
+ | |||
<syntaxhighlight> | <syntaxhighlight> | ||
function randg(mean,stddev: float): float; | function randg(mean,stddev: float): float; | ||
Line 29: | Line 32: | ||
== Exponentialverteilung == | == Exponentialverteilung == | ||
− | 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]. | + | |
− | + | 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]. | |
− | Die folgende Funktion liefert eine einzige Zufallszahl aus einer Exponentialverteilung. Der zu übergebende Wert ''rate'' ist der Kehrwert | + | |
+ | Die folgende Funktion liefert eine einzige Zufallszahl aus einer Exponentialverteilung. Der zu übergebende Wert ''rate'' ist der Kehrwert des Mittelwertes, und die Konstante '' Auflösung '' bestimmt die Granularität der erzeugten Zufallszahlen. | ||
+ | |||
<syntaxhighlight> | <syntaxhighlight> | ||
function randomExp(a, rate: real): real; | function randomExp(a, rate: real): real; | ||
Line 51: | Line 56: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == Gamma Verteilung == | + | == Gamma-Verteilung == |
− | Die Gammaverteilung ist eine kontinuierliche Wahrscheinlichkeitsverteilung über der Menge der positiven reellen Zahlen. Sie ist eine Verallgemeinerung der Exponentialverteilung | + | |
− | + | 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. | |
− | 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 <code>[[# | + | |
+ | 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 <code>[[#Exponentialverteilung|randomExp]]</code>. | ||
+ | |||
<syntaxhighlight> | <syntaxhighlight> | ||
function randomGamma(a, b, c: real): real; | function randomGamma(a, b, c: real): real; | ||
Line 130: | Line 137: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == Erlang Verteilung == | + | == Erlang-Verteilung == |
− | Die Erlang Verteilung ist eine stetige Wahrscheinlichkeitsverteilung, eine Verallgemeinerung der | + | |
− | Die Erlang Verteilung wird für die Warteschlangentheorie und zur Simulation von | + | 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. |
+ | |||
+ | Die Erlang Verteilung wird für die Warteschlangentheorie und zur Simulation von Wartezeiten verwendet. | ||
<syntaxhighlight> | <syntaxhighlight> | ||
Line 184: | Line 193: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == | + | == t-Verteilung == |
− | Die | + | 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). |
− | + | ||
− | Der folgende Algorithmus basiert auf der [[RTL/de|RTL]] Funktion <code>[[doc:rtl/system/random.html|random]]</code> und der Funktion <code>[[#Chi-Quadrat Verteilung|randomChisq]]</code>. | + | 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. |
+ | |||
+ | Der folgende Algorithmus basiert auf der [[RTL/de|RTL]] Funktion <code>[[doc:rtl/system/random.html|random]]</code> und der Funktion <code>[[#Chi-Quadrat-Verteilung|randomChisq]]</code>. | ||
+ | |||
<syntaxhighlight> | <syntaxhighlight> | ||
function randomT(df: integer): real; | function randomT(df: integer): real; | ||
Line 200: | Line 212: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == Chi-Quadrat Verteilung == | + | == Chi-Quadrat-Verteilung == |
− | Die Chi-Quadrat Verteilung ist eine stetige Wahrscheinlichkeitsverteilung über der Menge der positiven reellen Zahlen. Die Chi-Quadrat Verteilung wird in der Statistik verwendet | + | 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 <code>[[#Gamma-Verteilung|randomGamma]]</code>. |
+ | |||
<syntaxhighlight> | <syntaxhighlight> | ||
function randomChisq(df: integer): real; | function randomChisq(df: integer): real; | ||
Line 211: | Line 224: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == F-Verteilung oder | + | == F-Verteilung oder Fisher-Verteilung == |
− | Die F-Verteilung, die auch als Fisher-Snedecor Verteilung bezeichnet wird, ist eine kontinuierliche Wahrscheinlichkeitsverteilung. | + | 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 <code>[[#Chi-Quadrat Verteilung|randomChisq]]</code>. |
+ | |||
<syntaxhighlight> | <syntaxhighlight> | ||
function randomF(v, w: integer): real; | function randomF(v, w: integer): real; | ||
Line 227: | Line 241: | ||
* [[Functions for descriptive statistics]] | * [[Functions for descriptive statistics]] | ||
− | == | + | ==Literatur== |
#[http://projecteuclid.org/DPubS/Repository/1.0/Disseminate?view=body&id=pdf_1&handle=euclid.aoms/1177706645 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 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] | ||
#Dietrich, J. W. (2002). [http://openlibrary.org/books/OL24586469M/Der_Hypophysen-Schilddrüsen-Regelkreis Der Hypophysen-Schilddrüsen-Regelkreis]. Berlin, Germany: Logos-Verlag Berlin. ISBN 978-3-89722-850-4. OCLC 50451543. | #Dietrich, J. W. (2002). [http://openlibrary.org/books/OL24586469M/Der_Hypophysen-Schilddrüsen-Regelkreis Der Hypophysen-Schilddrüsen-Regelkreis]. Berlin, Germany: Logos-Verlag Berlin. ISBN 978-3-89722-850-4. OCLC 50451543. | ||
Line 234: | Line 248: | ||
#R.U. Seydel, Generating Random Numbers with Specified Distributions. In: Tools for Computational Finance, Universitext, [http://dx.doi.org/10.1007/978-1-4471-2993-6_2 DOI 10.1007/978-1-4471-2993-6_2], © Springer-Verlag London Limited 2012 | #R.U. Seydel, Generating Random Numbers with Specified Distributions. In: Tools for Computational Finance, Universitext, [http://dx.doi.org/10.1007/978-1-4471-2993-6_2 DOI 10.1007/978-1-4471-2993-6_2], © Springer-Verlag London Limited 2012 | ||
#Christian Walck, Hand-book on STATISTICAL DISTRIBUTIONS for experimentalists, Internal Report SUF–PFY/96–01, University of Stockholm 2007 | #Christian Walck, Hand-book on STATISTICAL DISTRIBUTIONS for experimentalists, Internal Report SUF–PFY/96–01, University of Stockholm 2007 | ||
− | + | ||
− | |||
{{AutoCategory}}[[Category:Unix/de]][[Category:Tutorials/de]] | {{AutoCategory}}[[Category:Unix/de]][[Category:Tutorials/de]] |
Revision as of 21:55, 7 February 2015
Zufallszahlen sind wichtige Quellen für wissenschaftliche Anwendungen, Bildung, Visualisierung und die Entwicklung von Spielen. Sie nehmen eine Schlüsselrolle in der Computersimulation ein.
Die Standardfunktion random
der RTL erzeugt Zufallszahlen, die eine Gleichverteilung zu erfüllen. Gleichverteilte Zufallszahlen sind nicht für jede Anwendung sinnvoll. Um Zufallszahlen mit einer anderen Verteilung zu erstellen, sind spezielle Algorithmen notwendig.
Normalverteilung (Gaußsche Verteilung)
Unter den verschiedenen Algorithmen zur Erzeugung normalverteilter Zufallszahlen ist das Box-Müller-Verfahren das effizienteste. Die folgende Funktion berechnet damit Gauß-verteilte Zufallszahlen:
function rnorm (mean, sd: real): real;
{Berechnet Gaußsche Zufallszahlen nach dem Box-Müller-Verfahren}
var
u1, u2: real;
begin
u1 := random;
u2 := random;
rnorm := mean * abs(1 + sqrt(-2 * (ln(u1))) * cos(2 * pi * u2) * sd);
end;
Der gleiche Algorithmus wird von der Funktion randg aus der RTL unit math verwendet:
function randg(mean,stddev: float): float;
Exponentialverteilung
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].
Die folgende Funktion liefert eine einzige Zufallszahl aus einer Exponentialverteilung. Der zu übergebende Wert rate ist der Kehrwert des Mittelwertes, und die Konstante Auflösung bestimmt die Granularität der erzeugten Zufallszahlen.
function randomExp(a, rate: real): real;
const
RESOLUTION = 1000;
var
unif: real;
begin
if rate = 0 then
randomExp := NaN
else
begin
repeat
unif := random(RESOLUTION) / RESOLUTION;
until unif <> 0;
randomExp := a - rate * ln(unif);
end;
end;
Gamma-Verteilung
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.
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
.
function randomGamma(a, b, c: real): real;
const
RESOLUTION = 1000;
T = 4.5;
D = 1 + ln(T);
var
unif: real;
A2, B2, C2, Q, p, y: real;
p1, p2, v, w, z: real;
found: boolean;
begin
A2 := 1 / sqrt(2 * c - 1);
B2 := c - ln(4);
Q := c + 1 / A2;
C2 := 1 + c / exp(1);
found := False;
if c < 1 then
begin
repeat
repeat
unif := random(RESOLUTION) / RESOLUTION;
until unif > 0;
p := C2 * unif;
if p > 1 then
begin
repeat
unif := random(RESOLUTION) / RESOLUTION;
until unif > 0;
y := -ln((C2 - p) / c);
if unif <= power(y, c - 1) then
begin
randomGamma := a + b * y;
found := True;
end;
end
else
begin
y := power(p, 1 / c);
if unif <= exp(-y) then
begin
randomGamma := a + b * y;
found := True;
end;
end;
until found;
end
else if c = 1 then
{ Die Gamma-Verteilung wird zur Exponentialverteilung, if c = 1 }
begin
randomGamma := randomExp(a, b);
end
else
begin
repeat
repeat
p1 := random(RESOLUTION) / RESOLUTION;
until p1 > 0;
repeat
p2 := random(RESOLUTION) / RESOLUTION;
until p2 > 0;
v := A2 * ln(p1 / (1 - p1));
y := c * exp(v);
z := p1 * p1 * p2;
w := B2 + Q * v - y;
if (w + D - T * z >= 0) or (w >= ln(z)) then
begin
randomGamma := a + b * y;
found := True;
end;
until found;
end;
end;
Erlang-Verteilung
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.
Die Erlang Verteilung wird für die Warteschlangentheorie und zur Simulation von Wartezeiten verwendet.
function randomErlang(mean: real; k: integer): real;
const
RESOLUTION = 1000;
var
i: integer;
unif, prod: real;
begin
if (mean <= 0) or (k < 1) then
randomErlang := NaN
else
begin
prod := 1;
for i := 1 to k do
begin
repeat
unif := random(RESOLUTION) / RESOLUTION;
until unif <> 0;
prod := prod * unif;
end;
randomErlang := -mean * ln(prod);
end;
end;
Poisson-Verteilung
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.
function randomPoisson(mean: integer): integer;
{ Generator for Poisson distribution (Donald Knuth's algorithm) }
const
RESOLUTION = 1000;
var
k: integer;
b, l: real;
begin
assert(mean > 0, 'mean < 1');
k := 0;
b := 1;
l := exp(-mean);
while b > l do
begin
k := k + 1;
b := b * random(RESOLUTION) / RESOLUTION;
end;
randomPoisson := k - 1;
end;
t-Verteilung
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).
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.
Der folgende Algorithmus basiert auf der RTL Funktion random
und der Funktion randomChisq
.
function randomT(df: integer): real;
{ Generator für die studentsche t-Verteilung }
begin
if df < 1 then randomT := NaN
else
begin
randomT := randg(0, 1) / sqrt(randomChisq(df) / df);
end;
end;
Chi-Quadrat-Verteilung
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
.
function randomChisq(df: integer): real;
begin
if df < 1 then randomChisq := NaN
else
randomChisq := randomGamma(0, 2, 0.5 * df);
end;
F-Verteilung oder Fisher-Verteilung
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
.
function randomF(v, w: integer): real;
begin
if (v < 1) or (w < 1) then
randomF := NaN
else
randomF := randomChisq(v) / v / (randomChisq(w) / w);
end;
Siehe auch
Literatur
- 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
- Dietrich, J. W. (2002). Der Hypophysen-Schilddrüsen-Regelkreis. Berlin, Germany: Logos-Verlag Berlin. ISBN 978-3-89722-850-4. OCLC 50451543.
- Press, W. H., B. P. Flannery, S. A. Teukolsky, W. T. Vetterling (1989). Numerical Recipes in Pascal. The Art of Scientific Computing, Cambridge University Press, ISBN 0-521-37516-9.
- Richard Saucier, Computer Generation of Statistical Distributions, ARL-TR-2168, US Army Research Laboratory, Aberdeen Proving Ground, MD, 21005-5068, March 2000.
- R.U. Seydel, Generating Random Numbers with Specified Distributions. In: Tools for Computational Finance, Universitext, DOI 10.1007/978-1-4471-2993-6_2, © Springer-Verlag London Limited 2012
- Christian Walck, Hand-book on STATISTICAL DISTRIBUTIONS for experimentalists, Internal Report SUF–PFY/96–01, University of Stockholm 2007