前言
刷视频看到三门问题,有点反直觉,通过分析想明白后,写程序验证一下
程序较简单,只用到python里random的randint()函数,该函数有两个参数a、b,作用是生成[a,b]之间的一个整数
一、三门问题是什么?
三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。
问题是:换另一扇门是否会增加参赛者赢得汽车的机率。如果严格按照上述的条件?
答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。
虽然该问题的答案在逻辑上并不自相矛盾,但十分违反直觉。这问题曾引起一阵热烈的讨论。
通过数学分析,我们知道交换后赢的概率更大,现在我们用程序结果来说明。
二、使用步骤
1.引入库
from random import randint
2.程序主体
c1=c2=c3=c4=0 #c1,c2,c3,c4用于四种对应结果计数 count=0 #懒得慢慢输入了,用循环代替,count小于500前默认交换 for i in range(1000): #做一千次实验 choices = [1, 2, 3] #有三个选择1,2,3,代表三道门 temp=choices #temp复制choices ans = randint(1, 3) #生成随机数ans为正确答案 #choice = int(input("输入你的选择(1/2/3):")) choice=randint(1,3) #随机生成choice表示我们的选择 choice1=choice #choice1表示第一次选择 for i in choices: #主持人为你排除选项 if i!=ans and i!=choice: print("为你排除了:%d" % i) temp.remove(i) break #choice2=input("是否选择更换?输入’yes‘确定更换:") #if choice2=='yes': count+=1 #count<500默认选择交换,>500默认不换 if count<500: if temp[0]!=choice: choice=temp[0] else: choice=temp[1] print("你的选择由-->%d更改为-->%d"%(choice1,choice)) if choice==ans: #输出结果 if choice==choice1: c1 += 1 print("恭喜你,你坚持了正确的答案!") else: c2 += 1 print("恭喜你,交换以后猜对了!") else: if choice==choice1: c3 += 1 print("你猜错了,应该交换的!") else: c4 += 1 print("原答案正确,换错了!") print("\n四种情况统计如下:\n原来猜对了且坚持答案:%d\t原来没猜对交换后对了:%d"%(c1,c2)) print("原来没猜对且坚持答案:%d\t原来猜对但交换后错了:%d"%(c3,c4)) print("\n坚持答案对的概率为:{:.2%}\t坚持答案错的概率为:{:.2%}".format(c1/500,c3/500)) print("交换后答对的概率为:{:.2%}\t交换后答错的概率为:{:.2%}".format(c2/500,c4/500))
三.运行结果
第一次
第二次
第三次
总结
分析三次运行结果,可以看出交换答对的概率约为2/3,不交换答对的概率约为1/3
从而成功验证了三门问题,不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3