Die in VB eingebaute Zufallsfunktion
Rnd erzeugt Zahlen zwischen 0 (einschließend) und 1 (ausschließend) in gleichmäßiger Verteilung, d.h. "0" kommt genauso oft vor wie "0,5" oder auch "0,78912345".
Im "reellen Leben" findet man jedoch oft die sogenannte Normalverteilung: Dies bedeutet, dass es einen gewissen
Durchschnitt gibt (z.B. typische Größe einer zufälligen erwachsenen Person: 170cm) und eine gewisse
Standardabweichung (in unserem Beispiel: 68% aller Personen sind zwischen 160cm und 180cm groß, ein paar wenige können allerdings noch kleiner bzw. größer sein). Man spricht in diesem Zusammenhang auch von einer
Gauss'schen Normalverteilung.
Die folgende Funktion gibt eine Normal-verteilte Zufallszahl mit Durchschnitt 0 und Standardabweichung 1 zurück; es werden also Zahlen zwischen -unendlich und +unendlich erzeugt, die etwa zu 68% zwischen -1 und 1 liegen:
Public Function RndNV() As Double
Dim RndSqr As Double
Dim Faktor As Double
Static RndNV2 As Double
Static UseRndNV2 As Boolean
'Jeder Durchgang erzeugt zwei Werte:
If UseRndNV2 Then
'Vorhandenen Wert nutzen:
RndNV = RndNV2
UseRndNV2 = False
Else
'Zwei neue Kandidaten erzeugen:
Do
RndNV = 2 * Rnd - 1#
RndNV2 = 2 * Rnd - 1#
RndSqr = RndNV * RndNV + RndNV2 * RndNV2
Loop Until RndSqr <= 1#
'Normierung:
Faktor = Sqr(-2# * Log(RndSqr) / RndSqr)
RndNV = RndNV * Faktor
RndNV2 = RndNV2 * Faktor
UseRndNV2 = True
End If
End Function
Entsprechend unserem obigen Beispiel kann mit folgender Anweisung ein zufällige Personengröße gemäß Normalverteilung erzeugt werden:
PersonCM = 170 + 10 * RndNV
Ursprünglicher Artikel von
Francesco Balena (VB-2-The-Max).