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