Frage

Ich mag eine Simulation ausgeführt werden, die einen Wert als Parameter verwendet aus einer dreieckförmigen Wahrscheinlichkeitsverteilung mit unterer Grenze A erzeugte, Modus B und und obere Grenze C. Wie kann ich diesen Wert in Python zu generieren? Gibt es etwas so einfaches wie expovariate (Lambda) (aus zufällig) für diese Verteilung oder muss ich diese Sache codieren?

War es hilfreich?

Lösung

Wenn Sie das NumPy Paket herunterladen, es hat eine Funktion numpy.random.triangular (links, Modus, rechts [Größe]), das tut genau das, was Sie suchen.

Andere Tipps

Da ich war die Überprüfung zufällig in der Dokumentation von Python 2.4 ich das verpasst haben:

random.triangular (low, high-Modus) ¶     Zurückgeben eines zufälligen Gleitkommazahl N, so dass low <= n <= hoch und mit dem festgelegten Modus zwischen diesen Grenzen. Der niedrige und hohe Grenzen Standard auf Null und Eins. Das Modusargument standardmäßig auf den Mittelpunkt zwischen den Grenzen, eine symmetrische Verteilung ergibt.      Neu in der Version 2.6 .

Lassen Sie uns sagen, dass Ihre Verteilung nicht durch NumPy oder der Python Standard Library behandelt wurde.

In Situationen, in denen die Leistung nicht sehr wichtig ist, Verwerfungsmethode ist ein nützliches Hack für das Erhalten von einer Verteilung zieht Sie haben noch kein Konto verwenden Sie haben.

Für Ihre Dreiecksverteilung, Sie könnten wie etwas tun

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 Proben zeichnen

pylab.hist([random_triangular(1, 6, 5) for t in range(10000)])

, um sicherzustellen, dass alles in Ordnung aussieht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top