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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top