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

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

3 ответов


Если вы загружаете пакет NumPy, он имеет функцию numpy.случайность.треугольный (левый, режим, правый [, размер]), который делает именно то, что вы ищете.


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

случайные.треугольный (низкий, высокий, режим)¶ Возвращает случайное число с плавающей запятой N такое, что low новое в версии 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)])

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