Python, SimPy: ¿Cómo generar un valor a partir de una distribución de probabilidad triangular?
-
03-07-2019 - |
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?
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.