Generating Random Numbers/de
Deutsch (de) |
English (en)
Zufallszahlen sind wichtige Quellen für wissenschaftliche Anwendungen, Bildung, Spiele-Entwicklung und Visualisierung.
Die Standard Funktion random
der RTL erzeugt Zufallszahlen, die eine gleichmäßige Verteilung zu erfüllen. Gleichmäßig verteilte Zufallszahlen sind nicht für jede Anwendung sinnvoll. Um Zufallszahlen mit einer anderen Verteilung zu erstellen sind spezielle Algorithmen notwendig.
Normale (gaußsche) Verteilung
Einer der häufigsten Algorithmen normalverteilte Zufallszahlen aus gleichmäßig verteilten Zufallszahlen erzeugen ist der Box-Müller Ansatz. Die folgende Funktion berechnet die nach Gauß verteilten Zufallszahlen:
function rnorm (mean, sd: real): real;
{Berechnet Gaußsche Zufallszahlen nach dem Box-Müller-Ansatz}
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 durch die Funktion randg aus der RTL unit math verwendet:
function randg(mean,stddev: float): float;
Exponentielle Verteilung
Eine Exponentialverteilung tritt häufig bei Problemen der realen Welt auf. Ein klassisches Beispiel ist die Verteilung der Wartezeiten zwischen unabhängigen Poisson-Zufallsereignissen, wie z.B. der radioaktive Zerfall von Kernen [Press et al. 1989].
Die folgende Funktion liefert eine einzige Zufallszahl aus einer exponentiellen Verteilung. Der zu übergebende Wert rate ist der Kehrwert der Mittleren und der Konstanten 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 der Exponentialverteilung und eine Verallgemeinerung 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 Exponential Verteilung 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 Warteschlangen 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
Studentsche t-Verteilung
Die studentsche t-Verteilung wird auch Student t-Verteilung bezeichnet, da sie von William Sealy Gosset 1908 unter dem Pseudonym Student veröffentlicht wurde. Die Student t-Verteilung ist eine kontinuierliche Wahrscheinlichkeitsverteilung. Die Student t-Verteilung spielt eine wichtige Rolle bei statistischen Analysen.
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. Die Chi-Quadrat Verteilung wird in der Statistik verwendet. Z. B. in der Schätzung, den Varianzen und bei Chi-Quadrat Tests. Sie besitzt eine spezielle Gammaverteilung mit c = df / 2 und b = 2. Daher ist die folgende Funktion ist 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 auch Fisher-Verteilung
The F distribution, also referred to as Fisher-Snedecor distribution, is a continuous probability distribution. It is used for F Test and ANOVA. It has two degrees of freedom that serve as shape parameters v and w and that are positive integers. The following function randomF makes use of 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
Referenzen
- 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