3门问题的简明解释与程序模拟

问题:三扇门,只有一扇门后面有奖品。你随便选择了一扇门。然后主持人打开了另一扇门,里面是空的。他问你"换不换?" 换还是不换的中奖率高?
答案:换的中奖率是2/3,不换的中奖率是1/3。
注意:主持人必定打开空门。他知道哪扇门有奖品。他不会打开你选择的门。

如果选择不换,即忽略主持人,中奖率是1/3。如果选择换,以奖品在0号门后为例:你选0,主持人选1或2,相应地你选2或1,不中奖。你选1,主持人只能选2,你只能选0,中奖。你选2,主持人只能选1,你只能选0,中奖。总结:如果你第一次选的是0,最后不中奖;如果第一次选的是1或2,最后必然换回0,中奖。3选2,中奖概率是2/3。奖品在1号或2号门后的结果一样。把程序里的prize = randint(0, 2)换成prize = 0,1,2中某个固定的数,结果一样。

1 - 不换的中奖率1/3 = 2/3,只是特例。若有10扇门,不换的中奖率是0.1, 换的中奖率不可能是0.9。总共3扇门,主持人选后剩两扇,非此即彼。

一个袋中里有三个球,0,1,2,摸一次拿到1的概率是1/3。如果球的编号换成0,1,0,拿到1的概率还是1/3,不是说摸到的球不是0就是1,所以概率是1/2。

门用0,1,2编号是为了便于程序处理:chosen = (chosen + 1) % 3

# -*- coding: gbk -*-
from random import randint
def test_randint():
    d = {}; cnt = 0
    for i in range(10000): i = randint(0, 2); d[i] = 1 + d.get(i, 0)
    print(d)
test_randint()
def p(num, den):
    a = float(cnt) / n; b = float(num) / den
    print(a, ' = ' if abs(a - b) < 0.01 else ' != ', num, '/', den, sep='')
cnt = 0; n = 300000
for i in range(n):
    prize = randint(0, 2)
    chosen = randint(0, 2)
    while True:
        host = randint(0, 2)
        if host != prize and host != chosen: break
    chosen = (chosen + 1) % 3
    if chosen == host: chosen = (chosen + 1) % 3
    if chosen == prize: cnt += 1
p(2, 3)

 

上一篇:从Java添加属性到Groovy对象


下一篇:【python开源项目】推荐一款prize万能抽奖小工具发布