7

我想运行一个模拟,它使用从具有下限 A、模式 B 和上限 C 的三角概率分布生成的值作为参数。如何在 Python 中生成这个值?这个分布有没有像 expovariate(lambda) (随机)这样简单的东西,还是我必须编写这个东西?

4

3 回答 3

9

如果你下载 NumPy 包,它有一个函数 numpy.random.triangular(left, mode, right[, size]) 完全符合你的要求。

于 2009-05-03T00:30:52.737 回答
6

因为,我从 Python 2.4 检查 random 的文档,所以我错过了这个:

random.triangular(low, high, mode)返回一个随机浮点数 N 使得 low <= N <= high 并且在这些边界之间具有指定的模式。下限和上限默认为零和一。mode 参数默认为边界之间的中点,给出对称分布。 2.6 版中的新功能

于 2009-05-03T02:55:44.790 回答
3

假设您的分发不是由 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)])

确保一切正常。

于 2009-05-28T20:49:34.227 回答