Polar-Methode
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:
- Erzeuge zwei voneinander unabhängige, gleichverteilte Zufallszahlen <math>u</math>, <math>v</math> im Intervall <math>[-1, 1]</math>
- 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.
- Berechne <math>p = \sqrt {\frac{-2 \cdot \ln q}{q}}</math>.
- <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++">
- 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]
- Vorlage:Cite book/URLVorlage:Cite book/MeldungVorlage:Cite book/MeldungVorlage:Cite book/MeldungVorlage:Cite book/MeldungVorlage:Cite book/MeldungVorlage:Cite book/MeldungVorlage:Cite book/Meldung2
Einzelnachweise[Bearbeiten]
<references/>