Normal-verteilte Zufallszahlen

Der hier vorgestellte Zufalls-Generator erzeugt Zahlen, die um einen angegebenen Mittelwert 'streuen'.

Als Vorgabe braucht dieser generator den Mittelwert und die Standardabweichung als Maß für die 'Breite' der Streuung.



Normal-Verteilung

Die Normalverteilung wird anschaulich durch die 'Glockenkurve' beschrieben:

Das Diagramm zeigt die Häufigkeit φ, mit welcher die jeweiligen Messwerte x auftreten. Achtung: Die Y-Skala ist gegenüber der X-Skala 5fach gedehnt.
Diese 'Dichte-Funktion' kann man mit der Formel berechnen:
Das Diagramm zeigt den einfachsten Fall mit dem Mittelwert μ=0 und der Standard-Abweichung σ=1
Die Fläche unter der Funktions-Kurve ist genau A=1, das entspricht der (gesamten, kumulierten) Wahrscheinlichkeit von 100%.



Leider werden keine Funktionen zur Erzeugung von normal-verteilten Zufallszahlen angeboten. Man findet lediglich unter den Analyse-Funktionen ein Programm Zufallszahlengenerierung. Dieses Programm ist jedoch zur Weitergabe an einfache AnwenderInnen nicht geeignet. Es bietet keine Funktionen sondern schreibt die erzeugten Zahlenwerte in einen Bereich von Zellen.
Auf dieser Seite wird gezeigt, wie man normal-verteilte Zufallszahlen selbst erzeugen und jede damit programmierte Kalkulation auch weitergeben kann.


Beispiel:
Erzeugen sie (z.B. mit der ↓ hier beschriebenen Funktion Zufallszahl_normal() ) 1000...10000 normal-verteilte Zufallszahlen, zählen sie die Ergebnisse und erstellen sie davon ein Säulen-Diagramm, so wie das auf der Seite → Zufallszahlen demonstriert wird.



Die Normal-Verteilung kann man theoretisch nur auf Gleitkomma-Zahlen anwenden. Ganze Zahlen können dieser Verteilung nur dann näherungsweise folgen, wenn sie in einer sehr großen Anzahl vorliegen.

Ein anschauliches Beispiel ist das Galton-Brett, von dem man im Internet viele (z.T. animierte) Beispiele findet.


Für die meisten Anwendungen genügen die hier vorgestellten Algorithmen:
Darüber hinaus gibt es Algorithmen, die höheren Ansprüchen genügen: Folgen von erzeugten Zufallszahlen dürfen sich nicht wiederholen. Zwischen den erzeugten Zahlen dürfen keine (auch sehr kleinen) Lücken auftreten.

Standard-Funktion ZUFALLSZAHL()


Alle modernen Programmiersprachen bieten eine ähnliche Funktion. Daher ist es nicht schwer, Programm-Beispiele aus der Literatur oder aus dem Internet in ein Kalkulations-Programm oder in eine Basic-Funktion zu übersetzen.

Die meisten einfachen Zufalls-Generatoren verwenden in ihren Formeln und Algorithmen eine Zufalls-Funktion, die gleichmäßig verteilte Gleitkomma-Zahlen im Intervall 0..z..1 erzeugt.
Auch die Beispiele dieser Seite verwenden diese Standard-Funktion, um mit ihrer Hilfe eine andere Verteilung von Zufallszahlen zu berechnen.

Box-Muller-Algorithmus

zur Erzeugung von normalverteilten Zufallszahlen



Die Berechnung jeder einzelnen Zufallszahl erfordert 4 Schritte, die man am besten in 4 benachbarten Zellen einer Tabellen-Kalkulation programmiert.

Die verwendeten Funktionen cos(), ln(), pi(), wurzel(), zufallszahl() sind in jedem Standard Tabellen-Kalkulations-Programm verfügbar.

Das Ergebnis in der Variablen z1 ist eine normal-verteilte Zufallszahl mit dem gewünschten Mittelwert miwe und der Standardabweichung stabw


Erzeugung von normalverteilten Zufallszahlen nach Box-Muller

 
A
B
C
D
1
MiWe
100
 
 
2
StAbw
5
 
 
3
a
b
z0
z1
4
=WURZEL(-2*LN(ZUFALLSZAHL()))
=COS(2*PI()*LN(ZUFALLSZAHL()))
=A4*B4
=C4*$B$2+$B$1
5
=WURZEL(-2*LN(ZUFALLSZAHL()))
=COS(2*PI()*LN(ZUFALLSZAHL()))
=A5*B5
=C5*$B$2+$B$1
 
⇓⇓
⇓⇓
⇓⇓
⇓⇓
Die in Spalte D erzeugten Werte 'streuen' um den in Zelle B1 vorgegebenen Mittelwert.

Die 'Breite' der Streuung wird mit der StandardAbweichung in Zelle B2 eingestellt.
Dieser Algorithmus hat einen besonderen Vorteil: Man kann ihn in einer einzigen Formel zusammenfassen.
Man muss die Formel nur 1mal besonders sorgfältig eingeben, kann sie dann aber beliebig oft kopieren und einsetzen:
 
A
10
z1
11
=(WURZEL(-2*LN(ZUFALLSZAHL()))+COS(2*PI()*LN(ZUFALLSZAHL())))*$B$2+$B$1
12
=(WURZEL(-2*LN(ZUFALLSZAHL()))+COS(2*PI()*LN(ZUFALLSZAHL())))*$B$2+$B$1
 
⇓⇓


Der Algorithmus wird in der Praxis nur in der Tabellen-Kalkulation verwendet, weil man dazu einige andere Funktionen braucht, die vergleichsweise lange Zeiten zu ihrer Berechnung brauchen.

Polar-Algorithmus

zur Erzeugung von normalverteilten Zufallszahlen


Die Berechnung erfolgt in einer   Programm‑Schleife:
Die 3 Schritte innerhalb der {} Klammern werden wiederholt, solange die Bedingung (v>=1) erfüllt ist.
Die Schleife wird in ca. 78% der Fälle nur 1mal durchlaufen, 17% 2mal, 5% 3mal und öfter.

Ein Standard Tabellen-Kalkulations-Programm kann keine Schleifen programmieren. Immerhin kann man den Algorithmus anschaulich nachbilden.
Zur praktischen Anwendung ist eine ↓ Benutzer-definierte Funktion in der Programmiersprache Basic besser geeignet.

Das Ergebnis in der Variablen z ist eine normal-verteilte Zufallszahl mit dem gewünschten Mittelwert miwe und der Standardabweichung stabw


Erzeugung von normalverteilten Zufallszahlen mit Polar-Algorithmus

 
A
B
1
Vorgaben
 
2
MiWe
100
3
StAbw
5
4
 
 
5
Erster Durchgang
 
6
x1
=2*ZUFALLSZAHL()-1
7
x2
=2*ZUFALLSZAHL()-1
8
v
=B6*B6+B7*B7
9
 
 
10
Zweiter Durchgang
 
11
x1
=2*ZUFALLSZAHL()-1
12
x2
=2*ZUFALLSZAHL()-1
13
v
=WENN(B8<1;B8;B11*B11+B12*B12)
14
 
 
15
Dritter Durchgang
 
16
x1
=2*ZUFALLSZAHL()-1
17
x2
=2*ZUFALLSZAHL()-1
18
v
=WENN(B13<1;B13;B16*B16+B17*B17)
19
 
 
20
w
=WENN(B18<1;WURZEL((-2*LN(B18))/B18);"")
21
z
=WENN(ISTZAHL(B20);B20*B16*B3+B2)
22
 
 
23
=WENN(NICHT(ISTZAHL(B20));"Kein ";"")
& "Ergebnis"
=WENN(ISTZAHL(B21);B21;"")
Dieses Beispiel simuliert die vom Algorithmus verlangte Schleife mit 3 Durchgängen:
Das funktioniert als Übungs-Programm, ist jedoch für die Praxis meist zu aufwändig.

Der erste Durchgang ist genau nach den angegebenen Formeln programmiert.

Im 2. Durchgangs wird die Variable v aus dem 1.Durchgang übernommen, wenn sie v<1 ist, oder erneut berechnet.

Im 3. Durchgangs wird die Variable v aus dem 2.Durchgang übernommen, wenn sie v<1 ist, oder erneut berechnet.

Nach dem letzten Durchgang werden die Variablen w und z berechnet.

In 99% der Fälle wird die gewünschte Zufallszahl in Zelle B21 erzeugt.
Nur in ca. 1% der Fälle liefert keiner der 3 Durchgänge ein brauchbares Ergebnis: In diesem Fall bleibt das Ergebnis leer. Man kann mehr Durchgänge rechnen und z.B. mit 6 Durchgängen eine Wahrscheinlichkeit von 99.99% für ein brauchbares Ergebnis erreichen.

Mit Klick auf Taste F9 werden in jeder Tabellen-Kalkulation neue Ergebnisse berechnet.

Zwölfer-Algorithmus

zur Erzeugung von normalverteilten Zufallszahlen


Die damit erzeugten Zufallszahlen genügen jedoch nur bescheidenen Ansprüchen, weil die Voraussetzung (unabhängige Zufallszahlen) nicht erfüllt sind.


Man berechnet die Summe von 12 einzelnen Zufallszahlen, jede davon gleich verteilt im Intervall 0...1, d.h. so wie von der Standard-Funktion ZUFALLSZAHL() geliefert.

Danach subtrahiert man den Mittelwert 12*1/2=6 und berücksichtigt die Vorgaben von Mittelwert und Standardabweichung.

Im links gezeigten Algorithmus-Beispiel wird die Summe in der Variablen s mit einer Schleife berechnet, die 12mal durchlaufen wird. Wenn man die Variable s mit dem Wert 6 initialisiert, dann fällt die Subtraktion weg.



Die Formel in Zelle B7 ist portabel: Man kann sie nach rechts oder nach unten ausfüllen, oder kopieren und in beliebige andere Zellen einsetzen.

Dieser Algorithmus eignet sich wegen mangelnder Qualität der Resultate nicht für professionelle Anwendungen.

Es ist jedoch rasch und einfach programmierbar und trotz aller Vorbehalte zur Simulation einfacher Modelle meist ausreichend. Insbesondere kommerzielle Modelle stellen meist geringe technische Anforderungen und arbeiten problemlos mit dem Zwölfer-Algorithmus.

In der Seefahrt wird der Begriff Zwölfer-Regel in ganz anderer Bedeutung verwendet. Man bezeichnet damit einfache Faustregeln zur Berechnung der Gezeiten (Ebbe & Flut).

Basic-Funktionen

Download des ↗ Basic-Moduls Random.bas mit diesen und anderen Funktionen.

Die praktische Anwendung der Basic-Funktion wird in den Download-Beispielen gezeigt.


Für MS-Excel muss man diese Option mit einem führenden Single-Quote Zeichen abschalten:
' Option VBASupport 1

Für LibreOffice oder OpenOffice muss man diese Option einschalten:
Option VBASupport 1



Das Beispiel verwendet zur Berechnung von normalverteilten Zufallszahlen nach dem Polar-Algorithmus eine Benutzer-definierte Funktion in der Programmiersprache Basic.

Als Argumente werden Mittelwert, Standardabweichung und Trigger an die Funktion übergeben. Der Trigger wird nicht zur Berechnung verwendet, sondern dient als Auslöser zur erneuten Berechnung bei gleichbleibenden Argumenten, z.B. mit Taste F9

Damit wird anschaulich gezeigt, wie man eine Basic-Funktion sinnvoll einsetzen kann. Sie ersetzt in einer einzigen Zelle (z.B. A8) alle Rechnungen des Polar-Algorithmus.

Darüber hinaus rechnet die Basic-Funktion wesentlich schneller und liefert in jedem Fall ein Ergebnis, weil sie beliebig viele Schleifen-Durchgänge ausführen kann.

Mit dieser Funktion kann man problemlos einige 1000 normal-verteilte Zufallszahlen erzeugen, in Intervallen zählen und das Ergebnis als Säulen-Diagramm anzeigen - so ähnlich wie auf der Seite → Zufallszahlen dargestellt.



Function Zufall_Normal( _
MittelWert As Double, _
StandardAbweichung As Double) As Double
Dim w, x1, x2 As Double

w = 1
While (w >= 1)
x1 = 2 * Rnd - 1
x2 = 2 * Rnd - 1
w = x1 * x1 + x2 * x2
Wend
w = Sqr((-2 * Log(w)) / w)
Zufall_Normal = w * x1 * StandardAbweichung + MittelWert
End Function

Download-Beispiele

Die Beispiele sind in ZIP-Archive verpackt, weil man diese Dateien bei den meisten Web-Providern problemlos verwalten kann.
Man muss die ZIP-Archive vor der Verwendung auspacken.

Das MS-Excel-Beispiel wurde im Datei-Format *.xls gespeichert, weil dieses mit allen gängigen Excel-Versionen verwendbar ist.


Die Dateien sind nicht geschützt. Man kann sie daher nicht nur ansehen und ausprobieren sondern auch beliebig verändern.