2009-05-03 8 views
6

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

ответ

6

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

4

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

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

+0

Это, вероятно, лучший ответ, чем принятый для большинства случаев использования. Это раздражает, что API имеет другой порядок для NumPy! –

2

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

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

+0

Хороший намек общего назначения! для ОП идея здесь относится к равномерности плотности желаемого распределения. –

Смежные вопросы