Zum Inhalt springen

Polar-Methode

aus Wikipedia, der freien Enzyklopädie

Die Polar-Methode von George Marsaglia und Thomas A. Bray ist ein Verfahren zur Erzeugung normalverteilter Zufallszahlen (Zufallszahlengenerator).

Geschichte[Bearbeiten]

Diese Methode geht zurück auf den Box-Muller-Algorithmus zur Erzeugung normalverteilter Zufallsgrößen. Bei diesem werden die euklidischen Koordinaten verwertet. Bei der Polar-Methode werden diese euklidischen Koordinaten in Polarkoordinaten umgewandelt. Das erspart die Auswertung von trigonometrischen Funktionen.

Beschreibung[Bearbeiten]

Man geht von zufälligen Punkten in der Ebene aus, die im Einheitskreis gleichverteilt sind. Aus deren Koordinaten werden jeweils zwei standardnormalverteilte Zufallszahlen erzeugt:

  1. Erzeuge zwei voneinander unabhängige, gleichverteilte Zufallszahlen <math>u</math>, <math>v</math> im Intervall <math>[-1, 1]</math>
  2. Berechne <math>q=u^2+v^2</math>. Falls <math>q = 0</math> oder <math>q \geq 1</math>, gehe zurück zu Schritt 1.
  3. Berechne <math>p = \sqrt {\frac{-2 \cdot \ln q}{q}}</math>.
  4. <math>x_1=u \cdot p</math> und <math>x_2=v \cdot p</math> sind nun zwei voneinander unabhängige, standardnormalverteilte Zufallszahlen.

Der Punkt <math>(u, v)</math> muss im Einheitskreis liegen (<math>q < 1</math>), und es muss <math>q > 0</math> gelten, da in den reellen Zahlen der Logarithmus von Null und die Division durch Null nicht definiert sind. Anderenfalls müssen zwei neue Zahlen <math>u</math> und <math>v</math> erzeugt werden.

Durch lineare Transformation lassen sich hieraus beliebige normalverteilte Zufallszahlen erzeugen: Die generierten Werte <math>x_i</math> sind <math>\mathcal{N}(0,1)</math>-verteilt, somit liefert <math>a \cdot x_i + b</math> Werte, die <math>\mathcal{N}(b,a^2)</math>-verteilt sind.

Implementierung[Bearbeiten]

Pseudocode[Bearbeiten]

Prozedur ErzeugeNormalverteilteZufallszahlen (Referenzparameter x1, x2)
  Wiederhole
    u = 2 * Zufallszahl - 1  // "Zufallszahl" liefert in [0,1)
    v = 2 * Zufallszahl - 1  //   gleichverteilte Werte
    q = u * u + v * v
  Solange bis (0 < q) und (q < 1)
  p = Wurzel (-2 * ln(q) / q)
  x1 = u * p
  x2 = v * p  // Rückgabe durch die Referenzparameter x1, x2
Ende

C++[Bearbeiten]

Die Polar-Methode erzeugt Werte aus der Standardnormalverteilung mit Erwartungswert 0 und Standardabweichung 1. Die folgende Implementierung in der Programmiersprache C++ generiert 10 standardnormalverteilte Zufallszahlen aus jeder Normalverteilung mit Erwartungswert μ und Varianz σ und gibt sie auf der Konsole aus.<ref>Stack Exchange Inc.: Marsaglia Normal Random Variables in C++</ref><syntaxhighlight lang="c++">

  1. include <iostream>

using namespace std;

// Diese Funktion berechnet eine standardnormalverteilte Zufallszahl double generateGaussian(double mu, double sigma) {

   double u, v, q, p; // Deklaration der lokalen Variablen
   do // Diese do-while-Schleife erzeugt Zufallszahlen u und v im Intervall [-1, 1] mit 0 < u² + v² < 1
   {
       u = (rand() / ((double)RAND_MAX)) * 2 - 1;
       v = (rand() / ((double)RAND_MAX)) * 2 - 1;
       q = u * u + v * v;
   } while (q >= 1 || q == 0);
   p = sqrt(-2 * log(q) / q);
   return mu + sigma * u * p;

}

// Hauptfunktion die das Programm ausführt void main() {

   double mu = 0; // Deklaration der lokalen Variablen
   double sigma = 1;
   for (int i = 0; i < 10; i++) // Diese for-Schleife berechnet standardnormalverteilte Zufallszahlen und gibt sie auf der Konsole aus
   {
       double gaussian = generateGaussian(mu, sigma); // Aufruf der Funktion
       cout << gaussian << endl; // Ausgabe auf der Konsole
   }

} </syntaxhighlight>

Siehe auch[Bearbeiten]

Literatur[Bearbeiten]

Einzelnachweise[Bearbeiten]

<references/>