Python, SimPy: Comment générer une valeur à partir d'une distribution de probabilité triangulaire?
-
03-07-2019 - |
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?
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.