Python, SimPy: как создать значение из треугольного распределения вероятностей?
Я хочу запустить моделирование, которое использует в качестве параметра значение, сгенерированное из треугольного распределения вероятностей с нижним пределом A, режимом B и верхним пределом C. Как я могу сгенерировать это значение в Python? Есть ли что-то простое, как expovariate(lambda) (от random) для этого распределения или мне нужно закодировать эту вещь?
3 ответов
Если вы загружаете пакет NumPy, он имеет функцию numpy.случайность.треугольный (левый, режим, правый [, размер]), который делает именно то, что вы ищете.
Так как я проверял документацию random От Python 2.4, я пропустил это:
случайные.треугольный (низкий, высокий, режим)¶ Возвращает случайное число с плавающей запятой N такое, что low новое в версии 2.6.
предположим, что ваш дистрибутив не обрабатывался NumPy или стандартной библиотекой Python.
в ситуациях, когда производительность не очень важна, выборка отбраковки-полезный хак для получения ничьих из дистрибутива, которого у вас нет, используя тот, который у вас есть.
для вашего треугольного распределения вы можете сделать что-то вроде
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
Вы можете построить некоторые образцы
pylab.hist([random_triangular(1, 6, 5) for t in range(10000)])
чтобы убедиться, что все выглядит хорошо.