Monte-Carlo模拟python中两个连续头的预期投掷

时间:2016-11-11 21:26:57

标签: python montecarlo

连续获得两个头的预期投掷次数为6.但是,在执行本次实验的多次运行的下面模拟时,我得到了与预期不同的图。你能帮我识别逻辑中的错误吗? 感谢

模拟投掷的代码,并在重复10000次遇到两个连续头时检查:

import random
def toss():
    return random.randint(0, 1)

expected_tosses=list()
for test in range(10000):
    a=toss()
    for i in range(2,100):
        b=toss()
        if a and b:
            expected_tosses.append(i)
            break
        a=b

import matplotlib.pyplot as plt
plt.hist(expected_tosses, range(1,10)) 
plt.show()

Histogram of number of tosses to get two consecutive heads

1 个答案:

答案 0 :(得分:3)

答:代码中的一些细微错误

您正在通过限制上循环来更改统计信息。改为使用无限循环。

然后代码看起来像下面哪个应该更精确:

import random
def toss():
    return random.randint(0, 1)

expected_tosses=list()
for test in range(10000):
    a=toss()

    i = 2
    while True:
        b=toss()
        if a and b:
            expected_tosses.append(i)
            break
        a=b
        i+=1

import matplotlib.pyplot as plt
print(sum(expected_tosses) / float(len(expected_tosses)))
plt.hist(expected_tosses, range(1,10))
plt.show()

B:解释输出

结果还可以!

我介绍了计算所需投掷的平均值(在上面的代码中)并打印出来。你会看到,手段看起来像你期望的那样!

一些示例输出(我们不使用种子,因此每次运行的结果都不同):

5.9941

要明确:平均值并没有告诉你关于直方图的形状的更多信息。也许这是你混乱的根源(在你的情节中接近最小值为6)。