Python, SimPy: как сгенерировать значение из треугольного распределения вероятностей?

Я хочу запустить симуляцию, в которой в качестве параметра используется значение, сгенерированное из треугольного распределения вероятностей с нижним пределом A, режимом B и верхним пределом C. Как я могу сгенерировать это значение в Python? Есть ли что-то столь же простое, как expovariate(lambda) (из случайного) для этого дистрибутива, или мне нужно кодировать эту вещь?


person andandandand    schedule 03.05.2009    source источник


Ответы (3)


Если вы загружаете пакет NumPy, в нем есть функция numpy.random.triangular(left, mode, right[, size]), которая делает именно то, что вы ищете.

person erik    schedule 03.05.2009

Поскольку я проверял случайную документацию из Python 2.4, я пропустил это:

random.triangular(low, high, mode)¶ Возвращает случайное число с плавающей запятой N, такое что low ‹= N ‹= high и с указанным режимом между этими границами. Нижняя и верхняя границы по умолчанию равны нулю и единице. Аргумент режима по умолчанию равен средней точке между границами, что дает симметричное распределение. Новое в версии 2.6.

person andandandand    schedule 03.05.2009
comment
Это, вероятно, лучший ответ, чем принятый для большинства случаев использования. Немного раздражает, что API имеет другой порядок, чем NumPy! - person Jamie Bull; 04.04.2016

Допустим, ваш дистрибутив не обрабатывался 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)])

чтобы убедиться, что все выглядит хорошо.

person othercriteria    schedule 28.05.2009
comment
Хорошая универсальная подсказка! для OP идея здесь заключается в том, чтобы связать униформу с плотностью желаемого распределения. - person Gregg Lind; 02.01.2012