Python,SimPy:如何从三角概率分布中生成一个值?
我想运行一个模拟,这个模拟需要一个参数,这个参数是从一个三角形概率分布中生成的,三角形分布的下限是A,众数是B,上限是C。我该如何在Python中生成这个值?有没有像expovariate(lambda)(来自random模块)那么简单的方法来处理这个分布,还是我需要自己编写代码?
3 个回答
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)])
来确保一切看起来正常。
7
因为我在查看Python 2.4的random模块文档时,错过了这个内容:
random.triangular(low, high, mode)¶ 这个函数会返回一个随机的小数N,满足low小于等于N,N又小于等于high,并且在这两个值之间有一个指定的mode。默认情况下,low和high的值是0和1。mode参数默认是这两个值的中间点,这样生成的随机数分布是对称的。 这个功能在2.6版本中新增。
10
如果你下载了NumPy这个包,它里面有一个函数叫做numpy.random.triangular(left, mode, right[, size]),这个函数正好可以满足你的需求。