python趣味编程---羊车门问题

我们今天看一个非常有意思的问题。

问题描述:

      你参加了一次抽奖活动,有三个关闭的门。其中有一个门后面装的是汽车,后面两个门后面装的是山羊。主持人知道每扇门后面是什么,你需要先选择一扇门,在开启它之前,主持人会在另外两扇门中选择一扇后面是山羊的门,打开,这时候,你可以在还没有打开的两扇门选择,请问你是否更改你的选择,是更改自己的选择猜中汽车的概率大,还是不更改自己的选择猜中汽车的概率大?

一般人是这么想的:

遇到这个问题的时候,很多人可能会调用自己有限的数学知识。

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)
  • 6
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值