假设我想在Python中模拟一个经典问题:有一个包含55%红球和45%绿球的包。
我想提取10个球,并检测所有这些球的可能性是绿色的。
我使用Monte Carlo模拟,使用函数random.sample(balls,10),如下所示:
from random import choice, shuffle, sample, randint
Red = False
Green = True
bags = [Red for _ in range(55)]
bags.extend([Green for _ in range(45)])
# shuffle(bags)
def testonce():
return all(sample(bags, 10))
def test(N):
K = 0
for _ in xrange(N): K += testonce()
return float(K)/N
print '/', test (10000000)
print ':', .45**10
此代码打印模拟检测到的概率和实际概率(正确答案)。它打印如此:
/ 0.0001848
: 0.00034050628916
这种差异向我显示
随机模块错误
我想念一些东西,并在代码中做错了。
我想念什么?如何正确编写模拟,这样当N增长时,返回的数字会收敛到实际概率?
答案 0 :(得分:2)
radom.sample
选择没有替换,你正在计算替换的概率。
random.sample(population, k)
Return a k length list of unique elements chosen from the population sequence. Used for random sampling without replacement.
(doc)
正确的概率(适用于你的MC)是:
In [30]: np.prod(np.arange(36,46)/np.arange(91.0,101))
Out[30]: 0.00018429406441449519