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

StackOverflow https://stackoverflow.com/questions/815969

Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

random.triangular (низкий, высокий, режим) & # 182;     Вернуть случайное число с плавающей запятой N, такое что low & Lt; = N & Lt; = high и с указанным режимом между этими границами. Нижние и верхние границы по умолчанию равны нулю и единице. По умолчанию для аргумента 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)])

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top