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 old_chosen = chosen chosen = (chosen + 1) % 3 if chosen == host: chosen = (chosen + 1) % 3 if chosen == prize: cnt += 1 if chosen == host or chosen == old_chosen: print('WTF!') p(2, 3)