北屋教程网

专注编程知识分享,从入门到精通的编程学习平台

Python模拟解决“谁是小偷问题”和神奇的“三门问题”

一、谁是小偷问题


1.问题描述:

警察局抓了啊,a,b,c,d,4名偷窃嫌疑犯,其中只有一人是小偷。审问中
    a说:我不是小偷
    b说:c是小偷
    c说:小偷肯定是d
    d说:c在冤枉人
现在已知四人中有3人在说真话,一人说假话,问到底谁是小偷。

2.Python代码:

#!/usr/bin/python
#  # Created by 老刘 on 2020/5/14
# #  Author: Lao Liu <412842374@qq.com>
def thief_is():
    for thief in ('a', 'b', 'c', 'd'):
        sum = ('a'!= thief)+(thief == 'c')+(thief == 'd')+(thief != 'd')
        if sum == 3:
            print("thief is %s"%thief)
if __name__ == '__main__':
    thief_is()

3.运行结果

thief is c

二、三门问题

1.问题描述

三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目 Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。

参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。
当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊(主持人肯定会开一扇有羊的门)。主持人其后会问参赛者要不要换另一扇仍然关上的门。

2.问题分析:

当选择了一扇门的时候,选择的这扇门有车的概率是1/3,那么其它两扇门有车的概率是2/3,这时主持人会在后两扇门中打开一扇有山羊的门,也就是后面的2/3中又有一扇门被确定了,那么此时的2/3的概率会收缩到最后一扇门上,所以在后一扇门上的出现汽车的概率(2/3)会大于第一扇门。下面我们来编写程序来验证下:

3.Python代码

我们先设置实验次数为10000次,随机在这1万次里选择换门还是不换门,然后通过实验统计换门获胜的次数和不换门获胜的次数。

#  #!/usr/bin/python
#  # Created by 老刘 on 2020/5/14
# #  Author: Lao Liu <412842374@qq.com>

from random import choice
#首先是不换门的方法stay():
def stay():
    doors = ['car','goat','goat']          #设置三扇门,其中两扇门后面是山羊,一扇门后是汽车
    choose = choice(doors)              #随机选择一扇门
    if choose == 'car':                        #不换门则直接判断
        return 'win'
    else:
        return 'lose'
#换门的方法switch()
def switch():
    doors = ['car', 'goat', 'goat']
    choose = choice(doors)
    doors.remove(choose)               #选择的门放一边
    doors.remove('goat')                 #剩下的门,去掉一只山羊
    if doors == ['car']:                      #换门
        return 'win'
    else:
        return 'lose'
if __name__ == '__main__':
    #设置实验次数为10000次
    total = 10000
    #统计随机选择换门的次数
    count_switch = 0
    #统计换门获得车辆的次数
    win_switch = 0
    #统计不换门的次数
    count_stay = 0
    #统计不换们获胜的次数
    win_stay = 0
    for i in range(total):
        choose = choice([1,2])          #随机选择换门还是不换门
        if choose == 1:
            count_switch += 1
            if switch() == 'win':
                win_switch += 1
        else:
            count_stay += 1
            if stay() == 'win':
                win_stay += 1

    print('系统随机分配的换门次数:',count_switch)
    print('换门后得到汽车次数    :',win_switch,'    获胜概率为:%.2f%%'%(100*win_switch/count_switch))
    print('系统随机分配的不换门次数:',count_stay)
    print('不换门后得到汽车次数:',win_stay,'    获胜概率为:%.2f%%'%(100*win_stay/count_stay))

4.运行结果:

系统随机分配的换门次数:    4946
换门后得到汽车次数 :          3276     获胜概率为:66.24%
系统随机分配的不换门次数: 5054
不换门后得到汽车次数:        1715      获胜概率为:33.93%

无论是从理论分析和实验结果来看,换门后人们中奖的概率比不换门中奖的概率高一倍,这就是学好数学和编程的优势。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言