Python, SimPy: ¿Cómo generar un valor a partir de una distribución de probabilidad triangular?

StackOverflow https://stackoverflow.com/questions/815969

Pregunta

Quiero ejecutar una simulación que use como parámetro un valor generado a partir de una distribución de probabilidad triangular con límite inferior A, modo B y límite superior C. ¿Cómo puedo generar este valor en Python? ¿Hay algo tan simple como expovariate (lambda) (de aleatorio) para esta distribución o tengo que codificar esto?

¿Fue útil?

Solución

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

Otros consejos

Desde entonces, estaba comprobando la documentación de random de Python 2.4. Me perdí esto:

random.triangular (bajo, alto, modo) & # 182;     Devuelve un número aleatorio de coma flotante N tal que bajo & Lt; = N & Lt; = alto y con el modo especificado entre esos límites. Los límites inferior y superior predeterminan cero y uno. El argumento de modo por defecto es el punto medio entre los límites, dando una distribución simétrica.      Nuevo en la versión 2.6 .

Digamos que su distribución no fue manejada por NumPy o Python Standard Library.

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 usando uno que sí tiene.

Para su distribución triangular, 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 trazar algunas muestras

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

para asegurarse de que todo se ve bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top