Python, SimPy: Comment générer une valeur à partir d'une distribution de probabilité triangulaire?

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

Question

Je souhaite exécuter une simulation qui utilise comme paramètre une valeur générée à partir d'une distribution de probabilité triangulaire avec une limite inférieure A, mode B et une limite supérieure C. Comment puis-je générer cette valeur en Python? Y a-t-il quelque chose d'aussi simple que expovariate (lambda) (tiré du hasard) pour cette distribution ou dois-je coder cette chose?

Était-ce utile?

La solution

Si vous téléchargez le package NumPy, il possède une fonction numpy.random.triangular (gauche, mode, droite [, taille]) qui fait exactement ce que vous recherchez.

Autres conseils

Depuis, je vérifiais la documentation de random de Python 2.4, mais j'ai raté ceci:

aléatoire.triangulaire (bas, haut, mode) & # 182;     Renvoie un nombre aléatoire N tel que low & Lt; = N & Lt; = high et avec le mode spécifié entre ces limites. Les limites basse et haute sont zéro et un par défaut. L'argument mode vaut par défaut au milieu des limites, ce qui donne une distribution symétrique.      Nouveauté de la version 2.6 .

Supposons que votre distribution n’ait pas été gérée par NumPy ou par la bibliothèque standard Python.

Dans les situations où les performances ne sont pas très importantes, l’échantillonnage de rejet est un hack utile pour tirer des tirages d’une distribution que vous n’avez pas déjà utilisée.

Pour votre distribution triangulaire, vous pouvez faire quelque chose comme

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

Vous pouvez tracer des échantillons

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

pour vous assurer que tout se passe bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top