Python, SimPy: Как сгенерировать значение из треугольного распределения вероятностей? - PullRequest
6 голосов
/ 03 мая 2009

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

Ответы [ 3 ]

7 голосов
/ 03 мая 2009

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

5 голосов
/ 03 мая 2009

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

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

3 голосов
/ 29 мая 2009

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

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

...