蒙特卡罗模拟期间random.sample函数的意外行为

时间:2013-01-13 08:00:49

标签: python random

假设我想在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增长时,返回的数字会收敛到实际概率?

1 个答案:

答案 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