Python验证蒙提霍尔问题

蒙提霍尔问题出自美国的电视游戏节目Let's Make a Deal,游戏的规则是:三扇关闭的门供参赛者选择,其中一扇门后面是汽车,其余两扇是山羊,当参赛者选定一扇门,但未去开启它的时候,主持人开启剩下两扇门的其中一扇,露出其中一只山羊。此时参赛者可以更换另一扇仍然关上的门。问:换另一扇门会否增加参赛者赢得汽车的机率?

Python验证蒙提霍尔问题_第1张图片
我要汽车,不要山羊

最早接触蒙提霍尔问题是从电影《决胜21点》中看到的,前几天在看《悖论》,正好发现其中有一章节讲的就是蒙提霍尔问题,结合书中的思路,下面我从概率学的角度来解答这个问题,并用一个python程序,来验证结论是否正确。(游戏规则不多述,读者可参考上文引言)

概率学

  1. 假设一位参赛者选择1号门,则1号门后是汽车的概率是 1/3,2号或3号门后是汽车的概率是 2/3(也就是说,2号门后是汽车的概率加上3号门后是汽车的概率的和是2/3,即 P(2) + P(3) = 2/3
  2. 此时主持人将2号门打开,露出一只山羊,说明2号门后面不是汽车,则2号门后是汽车的概率是 0,即 P(2) = 0
  3. 由1和2可知,P(2) + P(3) = 2/3P(2) = 0,所以很容易得出,P(3) = 2/3
  4. P(1) = 1/3P(3) = 2/3,我想到底应不应该从1号门换成3号门就不用多说了吧,换成3号门可是整整多两倍的概率中奖呀

Python程序验证

程序
# -*- coding: utf-8 -*-
#!/usr/bin/python

import matplotlib.pyplot as plt
import random
import pygal

class three_door():

    car_door = ''
    play_first_choice = ''
    play_second_choice = ''

    def __init__(self, change=0):

        #是否更换选择
        self.change = change
        #初始化三扇门
        self.door = ['A','B','C']


    #随机分配门后的东西
    def allocation_car(self):

        key = random.choice(self.door)
        self.__class__.car_door = key

    #参赛者选择
    def player_choice(self):

        key = random.choice(self.door)
        self.__class__.play_first_choice = key

    #主持人开门
    def compere_open(self):

        L1 = self.door.copy()
        L1.remove(self.__class__.play_first_choice)
        if self.__class__.car_door in L1:
            self.__class__.play_second_choice = self.__class__.car_door
        else:
            self.__class__.play_second_choice = random.choice(L1)


    def  check_car(self):

        self.allocation_car()
        self.player_choice()
        self.compere_open()
        play_choice = self.__class__.play_second_choice if self.change else self.__class__.play_first_choice
        if play_choice == self.__class__.car_door:
            return 1
        else:
            return 0

#试验10000次
num = 10000
#默认不更换选择
obj = three_door()
result = []
results = []

for i in list(range(1,num)):
    is_car = obj.check_car()
    result.append(is_car)


for value in [0,1]:
    count = result.count(value)
    results.append(count)



#调节图形大小,宽,高
plt.figure(figsize=(9,9))
#定义饼状图的标签,标签是列表
labels = [u'山羊',u'汽车']
#每个标签占多大,会自动去算百分比
sizes = [results[0],results[1]]
colors = ['yellowgreen','red']
#将某部分爆炸出来, 使用括号,将第一块分割出来,数值的大小是分割出来的与其他两块的间隙
explode = (0,0.05)

plt.pie(sizes,explode=explode,labels=labels,colors=colors,
                                labeldistance = 1.1,autopct = '%0.1f%%',shadow = False,
                                startangle = 90,pctdistance = 0.6)
plt.title('主持人开门后坚持不更换选择')
plt.show()
结论

Python验证蒙提霍尔问题_第2张图片
等着牵羊回家吧

Python验证蒙提霍尔问题_第3张图片
开汽车回家咯

从这两幅扇形图可以得出结论,更换选择赢得汽车的概率比坚持选择大得多,并且两者的概率接近于1/3,2/3,从而证明了我们上面的概率解答是没问题的

如果这篇文章对你有帮助,请点个赞哈,感谢

你可能感兴趣的:(Python验证蒙提霍尔问题)