有三扇关闭的门,其中两扇门的后面是空的,剩下一扇门后是一辆法拉利跑车。
当你选择一道门以后,暂时先不打开这扇门,接下来把剩下两扇门当中的一扇打开,是空门。
给你重新选择的机会:可以坚持刚才选择的门,也可以换另一扇没有打开的门。
如果你是游戏参与者,你怎样选择的获奖率更大?获奖率又是多少?
答案就是:换门,换门的中奖概率为2/3;如果不换,中奖概率为1/3
首先明确两点:在三扇门中选取一道,中奖概率为1/3;在两扇门中选取一道,中奖概率为1/2。现在的问题是在三扇门中先选取一道,然后去掉剩下两道中的一道空门,接下来中奖的概率是多少?
我们可以这样理解:假如我选择了1号门,中奖概率为1/3,那么不选择1号门的中奖概率为2/3(即2号门和3号门合并为一道大门,中奖概率为2/3),现在我们在大门中(2号门和3号门)中去掉一个空门。那么剩下的门中奖概率就等于2/3(即大门中奖概率为2/3,去掉一道空门只是改变大门大小,变为某个具体的门(2号或3号),不改变它的概率)。
如何去验证以上推论?以抛硬币为例,通过大量重复试验来统计正反面概率。同理我们也可以通过多次试验来统计换门或不换门的中奖概率。
- 参与者随机在三道门中选取一道,系统随机选取中奖的门号(即参与者的选择以及系统选择均为随机)
- 去掉一个空门(主持人在已知参与者的门号以及中奖门号的前提下,去掉一个空门)
- 获取去掉一个空门后的中奖情况。
- 重复1-3的步骤,统计次数
根据上述步骤,参考代码如下:
import random
#步骤说明:类似验证硬币的正反面的概率,通过多次的实验来验证统计去掉一个空门后不换门中奖的概率
#1:参与者随机在三道门中选取一道,系统随机选取中奖的门号(即参与者的选择以及系统选择均为随机)
#2:去掉一个空门(主持人在已知参与者的门号以及中奖门号的前提下,去掉一个空门)
#3:获取去掉一个空门后的中奖情况。
#4:重复1-3的步骤,统计次数
def three_door():
#自选的门号
a = random.randint(1, 3)
#中奖的门号
b = random.randint(1, 3)
#去掉空门后,剩下的门的门号
c = 0
#去掉一个空门 (如果刚好选中,则随机去掉一个空门;不然剩下的门就等于中奖门号)
if a == b:
if a == 1:
c = random.randint(1, 3)
elif a == 3:
c = random.randint(1, 3)
else :
c = random.randint(1, 3)
if c == 2:
c = 3
else :
c = b
#去掉一个空门之后,中奖返回1,不中返回0
if( a == b):
return 1
elif c == b:
return 0
if __name__ == "__main__":
#实验次数
A = 0
#中奖次数
B = 0
#不中次数
C = 0
#重复试验,统计次数
while(A<10000):
#去掉一个空门,不换门的中奖情况
D = three_door()
if D == 1:
A+=1
B+=1
elif D == 0:
A+=1
C+=1
print ("三门问题不换门胜率:{}".format(B/A) )
print ("三门问题换门胜率:{}".format(C/A) )