Difference between revisions of "Generating Random Numbers/de"

From Lazarus wiki
Jump to navigationJump to search
m (Move categories to page template)
 
(23 intermediate revisions by 5 users not shown)
Line 1: Line 1:
<b>Zufallszahlen</b> sind wichtige Quellen für wissenschaftliche Anwendungen, Bildung, Spiele-Entwicklung und Visualisierung.<br />
+
{{Generating Random Numbers}}
<br />
+
 
Die Standard Funktion <code> [[doc:rtl/system/random.html|random]] </code> der [[RTL/de|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.<br />
+
[[File:fpc source logo.png|right]]
<br />
+
'''Zufallszahlen''' sind wichtige Quellen für wissenschaftliche Anwendungen, Bildung, Visualisierung und die Entwicklung von Spielen. Sie nehmen eine Schlüsselrolle in der Computersimulation ein.
 +
 
 +
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-<code>[[doc:rtl/system/random.html|random]]</code>-Funktion der [[RTL/de|RTL]]. Vor der ersten Benutzung muss der Zufallszahlengenerator mit einem einmaligen Aufruf der Funktion <code>[[doc:rtl/system/randomize.html|randomize]]</code> initialisiert werden. Dies setzt den "Seed"-Werte des Generators. Vorzugsweise wird <code>randomize</code> zu Beginn der Programmausführung aufgerufen.
 +
 
 +
Alternativ stehen auf Unix- und Linux-basierten Systemen die virtuellen Geräte <code>[[Dev random|/dev/random]]</code> und <code>/dev/urandom</code> zur Verfügung. Sie erzeugen Zufallszahlen auf Hardware-Basis.
 +
 
 +
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.
 +
 
 
__TOC__
 
__TOC__
<br />
+
 
== Normale (gaußsche) Verteilung ==
+
== Gleichverteilung ==
Einer der häufigsten Algorithmen normalverteilte Zufallszahlen aus gleichmäßig verteilten Zufallszahlen erzeugen ist der [http://en.wikipedia.org/wiki/Box–Muller_transform Box-Müller Ansatz]. Die folgende Funktion berechnet die nach Gauß verteilten Zufallszahlen:<br />
+
 
<syntaxhighlight>
+
Die stetige Gleichverteilung (auch Rechteckverteilung oder Uniformverteilung) stellt eine Familie symmetrischer Wahrscheinlichkeitsverteilungen dar. Innerhalb eines definierten Intervalls hat sie eine konstante Wahrscheinlichkeitsdichte.
 +
 
 +
Die Standardfunktion <code> [[doc:rtl/system/random.html|random]] </code> der [[RTL/de|RTL]] erzeugt Zufallszahlen, die eine Gleichverteilung zu erfüllen. Wenn sie ohne Parameter aufgerufen wird, dann liefert <code>random</code> Fließkomma-Zufallszahlen aus dem Intervall [0, 1), d. h. 0 <= Ergebnis < 1. Wenn <code>random</code> dagegen mit einem longint-Argument L aufgerufen wird. liefert sie eine longint-Zufallszahl des Intervalls [0, L).
 +
 
 +
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 [http://en.wikipedia.org/wiki/Box–Muller_transform Box-Müller-Verfahren] das effizienteste. Die folgende Funktion berechnet damit Gauß-verteilte Zufallszahlen:
 +
 
 +
<syntaxhighlight lang=pascal>
 
  function rnorm (mean, sd: real): real;
 
  function rnorm (mean, sd: real): real;
  {Berechnet Gaußsche Zufallszahlen nach dem Box-Müller-Ansatz}
+
  {Berechnet Gaußsche Zufallszahlen nach dem Box-Müller-Verfahren}
 
   var
 
   var
 
   u1, u2: real;
 
   u1, u2: real;
Line 18: Line 35:
 
   end;
 
   end;
 
</syntaxhighlight>
 
</syntaxhighlight>
Der gleiche Algorithmus wird durch die Funktion [[doc:rtl/math/randg.html|randg]] aus der RTL unit [[doc:rtl/math/index.html|math]] verwendet:<br />
+
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 lang=pascal>
 
function randg(mean,stddev: float): float;
 
function randg(mean,stddev: float): float;
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Exponentielle Verteilung ==
+
== Exponentialverteilung ==
  
An exponential distribution occurs frequently in real-world problems. A classical example is the distribution of waiting times between independent Poisson-random events, e.g. the radioactive decay of nuclei [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].
  
The following function delivers a single real random number out of an exponential distribution. ''Rate'' is the inverse of the mean and the constant ''RESOLUTION'' determines the granularity of generated random numbers.
+
Die folgende Funktion liefert eine einzige Zufallszahl aus einer Exponentialverteilung. Der zu übergebende Wert <syntaxhighlight lang=pascal inline>rate</syntaxhighlight> ist der Kehrwert des Mittelwertes, und die Konstante <syntaxhighlight lang=pascal inline>RESOLUTION</syntaxhighlight> bestimmt die Granularität der erzeugten Zufallszahlen.
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
function randomExp(a, rate: real): real;
 
function randomExp(a, rate: real): real;
 
const
 
const
Line 48: Line 66:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Gamma Verteilung ==
+
== Gamma-Verteilung ==
  
The gamma distribution is a two-parameter family of continuous random distributions. It is a generalization of both the exponential distribution and the Erlang distribution. Possible applications of the gamma distribution include modelling and simulation of waiting lines, or queues, and actuarial science.
+
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.
  
The following function delivers a single real random number out of a gamma distribution. The shape of the distribution is defined by the parameters ''a'', ''b'' and ''c''. The function makes use of the function '''randomExp''' as defined above.
+
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 lang=pascal>
 
function randomGamma(a, b, c: real): real;
 
function randomGamma(a, b, c: real): real;
 
const
 
const
Line 102: Line 120:
 
   end
 
   end
 
   else if c = 1 then
 
   else if c = 1 then
     { Gamma distribution becomes exponential distribution, if c = 1 }
+
     { Die Gamma-Verteilung wird zur Exponentialverteilung, if c = 1 }
 
   begin
 
   begin
 
     randomGamma := randomExp(a, b);
 
     randomGamma := randomExp(a, b);
Line 129: Line 147:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Erlang Verteilung ==
+
== 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.
  
The Erlang distribution is a two parameter family of continuous probability distributions. It is a generalization of the exponential distribution and a special case of the gamma distribution, where ''c'' is an integer. The Erlang distribution has been first described by Agner Krarup Erlang in order to model the time interval between telephone calls. It is used for queuing theory and for simulating waiting lines.
+
Die Erlang Verteilung wird für die Warteschlangentheorie und zur Simulation von Wartezeiten verwendet.
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   function randomErlang(mean: real; k: integer): real;
 
   function randomErlang(mean: real; k: integer): real;
 
   const
 
   const
Line 158: Line 178:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Poisson Verteilung ==
+
== 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.
 +
 
 +
<syntaxhighlight lang=pascal>
 +
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;
 +
</syntaxhighlight>
 +
 
 +
== 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).
  
== Studentsche t-Verteilung ==
+
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.
The t distribution (also referred to a Student's t distribution, since it was published by William Sealy Gosset in 1908 under the pseudonym ''Student'') is a continuous probability distribution. Its shape is defined by one parameter, the degrees of freedom (''df''). In statistics, many estimators are t distributed. Therefore, Student's t-distribution plays a major role in a number of widely used statistical analyses, including Student's t-test for assessing the statistical significance of the difference between two sample means, the construction of confidence intervals for the difference between two population means, and in linear regression analysis. The t-distribution also arises in Bayesian analysis of data from a normal family.
 
  
The following algorithm depends on the [RTL]] function <code>[[doc:rtl/system/random.html|random]]</code> and on the '''[[#Chi Squared Distribution|randomChisq]]''' function
+
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 lang=pascal>
 
function randomT(df: integer): real;
 
function randomT(df: integer): real;
{ Generator for Student's t distribution }
+
{ Generator für die studentsche t-Verteilung }
 
begin
 
begin
 
   if df < 1 then randomT := NaN
 
   if df < 1 then randomT := NaN
Line 176: Line 222:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Chi-Quadrat Verteilung ==
+
== 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 <code>[[#Gamma-Verteilung|randomGamma]]</code>.
  
The chi squared distribution 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. The chi squared distribution has numerous applications in inferential statistics, e.g. in estimating variances and for chi-squared tests. It is a special [[#Gamma Distribution|gamma distribution]] with ''c'' = ''df''/ 2 and ''b'' = 2. Therefore the following function depends on the function '''randomGamma'''.
+
<syntaxhighlight lang=pascal>
 
 
<syntaxhighlight>
 
 
function randomChisq(df: integer): real;
 
function randomChisq(df: integer): real;
 
begin
 
begin
Line 189: Line 234:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== F Distribution ==
+
== 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 <code>[[#Chi-Quadrat Verteilung|randomChisq]]</code>.
  
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'''.
+
<syntaxhighlight lang=pascal>
 
 
<syntaxhighlight>
 
 
function randomF(v, w: integer): real;
 
function randomF(v, w: integer): real;
 
begin
 
begin
Line 203: Line 247:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== See also ==
+
== Siehe auch ==
 
* [[Dev random/de|Dev random]]
 
* [[Dev random/de|Dev random]]
 
* [[Functions for descriptive statistics]]
 
* [[Functions for descriptive statistics]]
  
==References==
+
==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&ndash;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&ndash;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 214: Line 258:
 
#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
<br />
 
<br />
 
 
{{AutoCategory}}[[Category:Unix/de]][[Category:Tutorials/de]]
 

Latest revision as of 08:22, 9 August 2020

Deutsch (de) English (en) suomi (fi) français (fr) polski (pl) русский (ru)

fpc source logo.png

Zufallszahlen sind wichtige Quellen für wissenschaftliche Anwendungen, Bildung, Visualisierung und die Entwicklung von Spielen. Sie nehmen eine Schlüsselrolle in der Computersimulation ein.

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-random-Funktion der RTL. Vor der ersten Benutzung muss der Zufallszahlengenerator mit einem einmaligen Aufruf der Funktion randomize initialisiert werden. Dies setzt den "Seed"-Werte des Generators. Vorzugsweise wird randomize zu Beginn der Programmausführung aufgerufen.

Alternativ stehen auf Unix- und Linux-basierten Systemen die virtuellen Geräte /dev/random und /dev/urandom zur Verfügung. Sie erzeugen Zufallszahlen auf Hardware-Basis.

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.

Gleichverteilung

Die stetige Gleichverteilung (auch Rechteckverteilung oder Uniformverteilung) stellt eine Familie symmetrischer Wahrscheinlichkeitsverteilungen dar. Innerhalb eines definierten Intervalls hat sie eine konstante Wahrscheinlichkeitsdichte.

Die Standardfunktion random der 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).

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 RESOLUTION 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

  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
  2. Dietrich, J. W. (2002). Der Hypophysen-Schilddrüsen-Regelkreis. Berlin, Germany: Logos-Verlag Berlin. ISBN 978-3-89722-850-4. OCLC 50451543.
  3. 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.
  4. Richard Saucier, Computer Generation of Statistical Distributions, ARL-TR-2168, US Army Research Laboratory, Aberdeen Proving Ground, MD, 21005-5068, March 2000.
  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, © Springer-Verlag London Limited 2012
  6. Christian Walck, Hand-book on STATISTICAL DISTRIBUTIONS for experimentalists, Internal Report SUF–PFY/96–01, University of Stockholm 2007