7 Stimmen

Python, SimPy: Wie generiert man einen Wert aus einer dreieckigen Wahrscheinlichkeitsverteilung?

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?

9voto

erik Punkte 1218

Wenn Sie das NumPy-Paket herunterladen, enthält es eine Funktion numpy.random.triangular(left, mode, right[, size]), die genau das tut, was Sie suchen.

6voto

andandandand Punkte 21174

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.

3voto

othercriteria Punkte 431

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X