Python,SimPy:如何从三角概率分布中生成一个值?

7 投票
3 回答
5276 浏览
提问于 2025-04-15 11:22

我想运行一个模拟,这个模拟需要一个参数,这个参数是从一个三角形概率分布中生成的,三角形分布的下限是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]),这个函数正好可以满足你的需求。

撰写回答