Ich möchte eine Simulation ausführen, die als Parameter einen Wert verwendet, der aus einer dreieckigen Wahrscheinlichkeitsverteilung mit Untergrenze A, Modus B und und Obergrenze C generiert wird. Wie kann ich diesen Wert in Python generieren? Gibt es etwas so Einfaches wie expovariate (Lambda) (zufällig) für diese Verteilung oder muss ich dieses Ding kodieren?Python, SimPy: Wie erstelle ich einen Wert aus einer dreieckigen Wahrscheinlichkeitsverteilung?
Antwort
Wenn Sie das NumPy-Paket herunterladen, hat es die Funktion numpy.random.trangular (links, Modus, rechts [, Größe]), die genau das tut, wonach Sie suchen.
Da war ich zufällig in der Dokumentation von Python 2.4 Überprüfung verpasste ich diese:
random.triangular (niedrig, hoch, mode) ¶ Return eine zufällige Gleitkommazahl N, so dass niedrige < = N < = hoch und mit dem angegebenen Modus zwischen diesen Grenzen. Die unteren und oberen Grenzen sind standardmäßig auf Null und Eins eingestellt. Das mode-Argument wird standardmäßig auf den Mittelpunkt zwischen den Grenzen gesetzt, was eine symmetrische Verteilung ergibt. Neu in Version 2.6.
Angenommen, Ihre Verteilung wurde nicht von NumPy oder der Python-Standardbibliothek verarbeitet.
In Situationen, in denen die Leistung nicht sehr wichtig ist, ist das Zurückweisungs-Sampling ein nützlicher Hack, um Auslosungen von einer Distribution zu erhalten, die Sie nicht verwenden.
Für Ihre Dreiecksverteilung, Sie so etwas wie
from random import random, uniform
def random_triangular(low, high, mode):
while True:
proposal = uniform(low, high)
if proposal < mode:
acceptance_prob = (proposal - low)/(mode - low)
else:
acceptance_prob = (high - proposal)/(high - mode)
if random() < acceptance_prob: break
return proposal
tun konnten Sie einige Beispiele
pylab.hist([random_triangular(1, 6, 5) for t in range(10000)])
, um sicherzustellen, plotten, dass alles in Ordnung aussieht.
Schöne allgemeine Hinweise! für OP bezieht sich hier die Idee auf die Dichte der gewünschten Verteilung. –
Dies ist wahrscheinlich eine bessere Antwort als die akzeptierte für die meisten Anwendungsfälle. Es ist irgendwie ärgerlich, dass die API eine andere Reihenfolge als die NumPy hat! –