Ich möchte eine Simulation durchführen, die als Parameter einen Wert verwendet, der aus einer dreieckigen Wahrscheinlichkeitsverteilung mit unterer Grenze A, Modus B und oberer Grenze C generiert wird. Wie kann ich diesen Wert in Python generieren? Gibt es etwas so Einfaches wie expovariate(lambda) (aus random) für diese Verteilung oder muss ich dieses Ding codieren?
Antworten
Zu viele Anzeigen?Da ich die Dokumentation von random aus Python 2.4 überprüfte, habe ich das verpasst:
random.triangular(low, high, mode)¶ Gibt eine zufällige Gleitkommazahl N zurück, sodass low <= N <= high und mit dem angegebenen Modus zwischen diesen Grenzen. Die unteren und oberen Grenzen werden standardmäßig auf null und eins festgelegt. Das Modus-Argument wird standardmäßig auf den Mittelpunkt zwischen den Grenzen gesetzt, was eine symmetrische Verteilung ergibt. Neu in Version 2.6.
Sagen wir, dass Ihre Verteilung nicht von NumPy oder der Python Standardbibliothek behandelt wurde.
In Situationen, in denen Leistung nicht sehr wichtig ist, ist die Rückweisungsmethode ein nützlicher Trick, um Ziehungen aus einer Verteilung zu erhalten, die Sie nicht haben, indem Sie eine nutzen, die Sie haben.
Für Ihre dreieckige Verteilung könnten Sie etwas Ähnliches tun 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
Sie können einige Beispiele plotten
pylab.hist([random_triangular(1, 6, 5) for t in range(10000)])
um sicherzustellen, dass alles in Ordnung aussieht.