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