2009-05-03 23 views

Respuesta

6

Si descarga el paquete NumPy, tiene una función numpy.random.triangular (izquierda, modo, derecha [, tamaño]) que hace exactamente lo que está buscando.

4

Puesto que, yo era la documentación de azar de Python 2.4 echaba de menos esta:

random.triangular (baja, alta, de modo) ¶ devolver un número aleatorio de punto flotante N tal que bajo < = N < = alto y con el modo especificado entre esos límites. Los límites bajo y alto por defecto son cero y uno. El argumento de modo se establece de manera predeterminada en el punto medio entre los límites, dando una distribución simétrica. Nuevo en la versión 2.6.

+0

Esta es probablemente una mejor respuesta que la aceptada para la mayoría de los casos de uso. ¡Es un poco molesto que la API tenga un orden diferente al de NumPy! –

2

Digamos que su distribución no fue manejada por NumPy o la biblioteca estándar de Python.

En situaciones donde el rendimiento no es muy importante, el muestreo de rechazo es un truco útil para obtener sorteos de una distribución que no tiene utilizando una que sí tiene.

Para su distribución triangular, que podría hacer algo como

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 

Puede representar algunas muestras

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

para asegurarse de que todo se ve bien.

+0

¡Sugerencia agradable para propósitos generales! para OP, la idea aquí es relacionar el uniforme con la densidad de la distribución deseada. –

Cuestiones relacionadas