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