Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Allgemein / Mathe / RndNV

Normal-verteilte Zufallszahlen

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).

© Jost Schwider, 26.11.2000-26.11.2000 - http://vb-tec.de/rndnv.htm