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