2009-05-03 30 views

risposta

6

Se si scarica il pacchetto NumPy, ha una funzione numpy.random.triangular (sinistra, modalità, destra [, dimensione]) che fa esattamente ciò che si sta cercando.

4

Dato, stavo controllando la documentazione del caso da Python 2.4 ho perso questo:

random.triangular (basso, alto, modo) ¶ restituire un numero in virgola mobile casuale N tale che a basso < = N < = alto e con la modalità specificata tra questi limiti. I limiti inferiore e superiore sono impostati su zero e uno. L'argomento della modalità passa automaticamente al punto medio tra i limiti, dando una distribuzione simmetrica. Novità nella versione 2.6.

+0

Questa è probabilmente una risposta migliore di quella accettata per la maggior parte dei casi d'uso. È piuttosto fastidioso che l'API abbia un ordine diverso da quello di NumPy! –

2

Supponiamo che la distribuzione non sia stata gestita da NumPy o dalla libreria standard Python.

In situazioni in cui le prestazioni non sono molto importanti, il campionamento del rifiuto è un utile trucco per ottenere i disegni da una distribuzione che non si ha utilizzando uno che si ha.

Per la vostra distribuzione triangolare, si potrebbe fare qualcosa di simile

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 

È possibile tracciare alcuni campioni

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

per assicurarsi che tutto sembra a posto.

+0

Bel suggerimento generale! per OP, l'idea qui è relativa all'uniforme alla densità della distribuzione desiderata. –

Problemi correlati