蒙特卡罗模拟 Python

1 投票
1 回答
7056 浏览
提问于 2025-04-18 11:55

我正在使用蒙特卡洛模拟来模拟一个保养系统。在我的模拟中,有一些设备有一定的故障率。比如说,故障率是1/100000,这意味着每年大约有1台设备会出现故障。如果设备坏了,我需要支付更换费用。但是我不太明白如何在模拟中随机捕捉到设备故障。根据我的理解,我需要使用概率分布来模拟这种情况,但我不知道该怎么做。

随机包中的函数似乎提供的是某个特定范围内的随机数,而我并没有这个范围。此外,我也不知道这是什么样的分布。

我希望这个问题对大家来说是有意义的。任何帮助都将不胜感激。

关于这个问题的更新:

我做了这个

    #/usr/bin/python
    import random 

    def main():
        count =0
        #fail rate is 1% of 100000, I need to do this probabilistically
        for _ in range(1,100000):
            x=random.random()
            if x <= 1.0/100000:
                count += 1

                print "x = "+str(x)+" fail device"
        print "device failed "+str(count)+"  times"

    if __name__ == '__main__':
        main()

然后我得到了这样的输出

        x = 0.000743343826396 fail device
        device failed 1  times
        [Finished in 0.0s]

感谢timgeb的帮助!不过,我想知道这种行为是否和考虑1/100000的故障率是一样的?

1 个回答

2

每年出现故障的设备数量(或者说其他时间单位)是遵循泊松分布的。如果你有 n 个设备,使用 m 年,并且每年的故障率是 p,那么你可以通过使用 numpy.random.poisson 来随机生成故障设备的数量:

import numpy as np

n = 100000
m = 5
p = 1.0 / 100000

failed = np.random.poisson(n * m * p)

这个 np.random.poisson 函数会随机决定故障设备的数量。你可以多次运行最后一行,看看会发生什么。

据我所知,纯 Python 并没有内置泊松分布的功能,虽然可以通过一些数学计算,比如从高斯随机数中推导出来。

撰写回答