Dreiecks-verteilte Zufallszahlen


Dreiecks-Verteilung

Die 'Dreiecks-Verteilung' ist ein rein empirisches Werkzeug zur Erzeugung von solchen Zufalls-Daten, deren gewünschte Häufigkeits-Verteilung sich mit exakten mathematischen Methoden nur schwer beschreiben lässt.


Beispiel:  Straßenverkehr
Die Häufigkeit von Fahrzeugen beginnt um 04:00 Uhr mit dem Wert =0 und steigt bis zum Maximum um 08:30 kontinuierlich an.
Sie fällt dann bis 09:30 und bleibt bis 15:30 konstant.
Danach steigt sie bis zu einem Maximum um 17:30 und fällt danach bis 24:00 wieder auf den Wert =0.

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.

Dreiecks-Algorithmus



Ein Dreiecks-Generator erzeugt keine Zufallszahlen außerhalb der angegebenen Grenzen.



Die Hilfs-Variable lim dient zur Unterscheidung, ob die Zufallszahl in den steigenden Ast der Verteilung (links des Peaks) oder in den fallenden Ast (rechts des Peaks) fällt.

Als erzeugende Funktion wird hier die Quadratwurzel im Bereich sqrt(0) bis sqrt(1) verwendet: Damit wird ein Anfangswert an die Variable x zugewiesen.

Danach wird mit einer weiteren Zufallszahl in einer Bedingten Verzweigung (if) entschieden, ob das Ergebnis auf dem steigenden oder auf dem fallenden Ast der Verteilugs-Funktion liegen soll.
Der Wert von x wird an den gewählten Ast der Verteilungs-Funktion angepasst.

Zuletzt wird der Vorgabe-Wert des Maximums addiert. Das Ergebnis ist eine Zufallszahl im vorgegebenen Bereich.


Aus allen Funktionen dieser Familie kann man komplexe Modelle zusammenstellen. Derartige Zufalls-Generatoren findet man nicht in der wissenschaftlichen Statistik sondern 'nur' in empirischen Modellen bzw. In Programmen zur Modell-Simulation.



Als Kriterium für die Auswahl dient die relative Fläche unter der jeweiligen Verteilungs-Funktion. Die gesamte Fläche muss =1 sein, das entspricht einer Wahrscheinlichkeit von 100%.



(3) Die relativen Anteile werden kumuliert (laufend addiert) daraus die Grenzen berechnet:
lim[0]=0, lim[1]=0.25, lim[2]=0.75, lim[3]=1

(4) Verzweigungs-Algorithmus:
Eine Zufallszahl 0..r..1 wird berechnet.
r=z()
Danach wird nach den berechneten Grenzen verzweigt:
if(r<lim[1]) {...steigender Ast...}
else if(r<lim[2]) {.,.. Plateau...}
else{...fallender Ast...}

(5) Je nach Verzweigung wird der ausgewählte Zufallszahlen-Generator aufgerufen, welcher die endgültig erzeugte Zufallszahl liefert:
Für den steigenden und fallenden Ast verwendet man eine Dreiecks-Funktion, für das Plateau eine in diesem Intervall → gleich verteilte Zufallszahl.

Tabellen-Kalkulation


Sie müssen dafür sorgen, dass eine sinnvolle Reihenfolge der 3 Vorgabe-Werte eingehalten wird:
Es soll Obergrenze>Untergrenze sein, der Peak soll dazwischen liegen.

Fortgeschrittene EntwicklerInnen garantieren sinnvolle Vorgaben mit Menü Daten / Gültigkeit

Die Hilfs-Variable Limit ist keine Vorgabe, wird jedoch sinnvoll nur 1mal aus den Vorgaben berechnet.



Der Dreiecks-Algorithmus lässt sich in der Formel einer einzigen Zelle zusammenfassen.

Die Formel ist portabel: Man kann sie nach rechts oder nach unten ausfüllen, oder kopieren und beliebig oft einsetzen.

Basic-Funktionen


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

Die (gleichnamigen) Basic-Funktionen dieses Moduls sind ungekürzt.


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


Function Zufalls_Dreieck(Untergrenze As Double, _
Peak As Double, Obergrenze As Double) As Double
Dim x, left As Double
left = (Peak - Untergrenze) / (Obergrenze - Untergrenze)
x = 1 - Sqr(1 - Rnd)
If Rnd < left Then
x = x * (Untergrenze - Peak)
Else
x = x * (Obergrenze - Peak)
End If
Zufalls_Dreieck = x + Peak
End Function