2009-05-03 4 views

Antwort

6

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.

4

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.

+0

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! –

2

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.

+0

Schöne allgemeine Hinweise! für OP bezieht sich hier die Idee auf die Dichte der gewünschten Verteilung. –

Verwandte Themen