Python, simpy: Como gerar um valor de uma distribuição de probabilidade triangular?
-
03-07-2019 - |
Pergunta
Eu quero correr uma simulação que usa como parâmetro um valor gerado a partir de uma distribuição de probabilidade triangular com limite inferior A, modo B ee limite superior C. Como posso gerar esse valor em Python? Existe algo tão simples como expovariate (lambda) (de forma aleatória) para esta distribuição ou eu tenho que código essa coisa?
Solução
Se você baixar o pacote NumPy, ele tem uma função numpy.random.triangular (esquerda, de modo, direito [, size]) que faz exatamente o que você está procurando.
Outras dicas
Uma vez, eu estava verificando a documentação do aleatório de Python 2.4 eu perdi isso:
random.triangular (baixo, alto, de modo) ¶ Devolver um número de ponto flutuante aleatório N tal que a baixa <= N <= alta e com o modo especificado entre estes limites. A baixa e alta limites padrão para zero e um. Os padrões argumento Modo para o ponto médio entre os limites, dando uma distribuição simétrica. Novo na versão 2.6 .
Vamos dizer que a sua distribuição não foi tratada por NumPy ou biblioteca padrão do Python.
Em situações onde o desempenho não é muito importante, a rejeição de amostragem é um hack útil para obter desenha a partir de uma distribuição que não têm usando um você tem.
Para a sua distribuição triangular, você poderia fazer 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
Você pode traçar algumas amostras
pylab.hist([random_triangular(1, 6, 5) for t in range(10000)])
para se certificar de que tudo parece ok.