美文网首页数学基础程序员
Python验证蒙提霍尔问题

Python验证蒙提霍尔问题

作者: Lee_DH | 来源:发表于2017-11-01 19:59 被阅读78次

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

    我要汽车,不要山羊

    最早接触蒙提霍尔问题是从电影《决胜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()
    
    结论
    等着牵羊回家吧
    开汽车回家咯
    从这两幅扇形图可以得出结论,更换选择赢得汽车的概率比坚持选择大得多,并且两者的概率接近于1/3,2/3,从而证明了我们上面的概率解答是没问题的

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

    相关文章

      网友评论

        本文标题:Python验证蒙提霍尔问题

        本文链接:https://www.haomeiwen.com/subject/xjggpxtx.html