我们今天看一个非常有意思的问题。
问题描述:
你参加了一次抽奖活动,有三个关闭的门。其中有一个门后面装的是汽车,后面两个门后面装的是山羊。主持人知道每扇门后面是什么,你需要先选择一扇门,在开启它之前,主持人会在另外两扇门中选择一扇后面是山羊的门,打开,这时候,你可以在还没有打开的两扇门选择,请问你是否更改你的选择,是更改自己的选择猜中汽车的概率大,还是不更改自己的选择猜中汽车的概率大?
一般人是这么想的:
遇到这个问题的时候,很多人可能会调用自己有限的数学知识。
1:如果不更改,就相当于是在三扇门中随机选择了一扇门,总数是三个,汽车的数量是一个。那么选中汽车的概率就是1/3.
2:如果更改自己的选择,由于主持人排除了一只山羊,那么就只剩下一个山羊和一辆汽车,在其中更改以后相当于随机选择,概率就是1/2.
逻辑很正确,可惜,错了。
程序员是这么想的:
用python模拟一下,结果是
最后的结果是,如果不更改选项,获得汽车的概率是33%
如果更改选项,获得汽车的概率是66%。
我们来看一看具体的方案。
我们用python模拟一下这个问题。
首先我们导入random
因为选择是随机的,我们需要导入这个模块去生成随机数。
随后,我们设置一下循环的次数TIMES。也就是进行多少次模拟。
再设置一个变量no_choice_n。代表的就是如果不进行更换。
一共可以多少次获得汽车
from random import*
TIMES = 1000
no_choice_n=0#初始化不改获得汽车的次数
choice_n=0#初始化更改获得汽车的次数
doors=['汽车','山羊','山羊']
还有一个choice_n。意思就是如果更改选择,可以多少次获得汽车
初始化我们将它们全部设置成0,模拟中,每成功一次将它加上一。
对于汽车和山羊,我们定义一个列表,其中有两个山羊,一个汽车。
首先我们来循环TIMES次。模拟不更改选择时,判断一共选中了汽车多少次。如果不更改选择,那么就相当于在三个门中随机选择一扇门,然后打开,
我们用first_choice = randint(0, 2)。随机生成0,1,2三个数。分别水印doors列表中的汽车山羊,山羊。
if doors[first_choice]=='汽车':
no_choice_n=no_choice_n+1
else:
pass
就加上1。
最后一共是成功了no_choice_n次
成功率是print(no_choice_n/TIMES)
当我们选择更改门的时候,就要考虑主持人打开的那扇门了。主持人肯定会找一扇后面是山羊的门打开。用计算机模拟的时候,我们就在0,1,2中随机选一个数。选择的数不能和我第一次选择的数重复,也不能背后是汽车。
如果不满足这两个条件,就要重新选择,一直到选中满足两个条件的门为止。
这里用到的是while循环。
然后,我们还要选出剩下的那个门,也是用到while循环,如果和前面的两扇门重复,就要重新选择,一直到选中剩下的门为止。
最后,我们判断一下剩下的这个门是不是汽车,如果是汽车,那么我们就让
choice_n+1。
最后的结果是,如果不更改选项,获得汽车的概率是33%
如果更改选项,获得汽车的概率是66%。
最后打印出更改选择时候的正确率。
完整代码如下:
from random import*
TIMES = 1000
no_choice_n=0#初始化不改获得汽车的次数
choice_n=0#初始化更改获得汽车的次数
doors=['汽车','山羊','山羊']
#当你选择不更改选择时
for i in range(0,TIMES):
first_choice = randint(0, 2)
if doors[first_choice]=='汽车':
no_choice_n=no_choice_n+1
else:
pass
print(no_choice_n/TIMES)
#当你选择更改选择时
for i in range(0,TIMES):
first_choice = randint(0, 2)
while 1:
host_choice = randint(0, 2)
if host_choice == first_choice or doors[host_choice] == '汽车':
host_choice = randint(0, 2)
else:
break
second_choice=randint(0, 2)
while 1:
if second_choice==host_choice or second_choice==first_choice:
second_choice=randint(0, 2)
else:
break
if doors[second_choice]=='汽车':
choice_n=choice_n+1
else:
pass
print(choice_n/TIMES)
更多推荐
python趣味编程---羊车门问题
发布评论