Python, SimPy: Как сгенерировать значение из треугольного распределения вероятностей?
-
03-07-2019 - |
Вопрос
Я хочу запустить симуляцию, в которой в качестве параметра используется значение, сгенерированное из треугольного распределения вероятностей с нижним пределом A, режимом B и верхним пределом C. Как я могу сгенерировать это значение в Python? Есть ли что-то такое простое, как expovariate (lambda) (от random) для этого дистрибутива, или мне нужно написать эту штуку?
Решение
Если вы загружаете пакет NumPy, он имеет функцию numpy.random.triangular (left, mode, right [, size]), которая делает именно то, что вы ищете.
Другие советы
С тех пор, как я проверял документацию рандома из Python 2.4, я пропустил это:
random.triangular (низкий, высокий, режим) & # 182; Вернуть случайное число с плавающей запятой N, такое что low & Lt; = N & Lt; = high и с указанным режимом между этими границами. Нижние и верхние границы по умолчанию равны нулю и единице. По умолчанию для аргумента mode используется средняя точка между границами, что дает симметричное распределение. Новое в версии 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)])
чтобы убедиться, что все выглядит хорошо.