0

假设我想用 Python 模拟一个经典问题:有一个袋子,里面有 55% 的红球和 45% 的绿球。

我想提取 10 个球,并检测所有这些球为绿色的概率是多少。

我使用蒙特卡罗模拟,使用这样的函数 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 增长时,返回的数字收敛到真实概率?

4

1 回答 1

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.

文档

正确的概率(对于你 MC)是:

In [30]: np.prod(np.arange(36,46)/np.arange(91.0,101))
Out[30]: 0.00018429406441449519
于 2013-01-13T08:05:49.797 回答