中期见到这些问题是初中的时候买了一本关于数学谜题的书里面概率论的一张的课后拓展就是说到三门题材,当时作为一个扩展阅读看了刹那间,里面说到了一个世界智慧最高的农妇秒杀了美利坚合众国一大群的数学高材生的可以故事(相比较夸张),当时对这多少个题材也是似懂非懂。

什么是蒙提霍尔问题?

新能源车 1

蒙提霍尔

蒙提霍尔问题,亦称作蒙特霍题材或三门题材(英文:Monty 哈尔l
problem),是一个起源博弈论的数学游戏题材,大致出自美利坚联邦合众国的电视娱乐节目Let’s
Make a Deal。问题的名字来自该节目的主持人蒙提·霍尔(Monty 哈尔(Hal)l)。

早期的发挥是:

参赛者会映入眼帘三扇关闭了的门,其中一扇的末尾有一辆汽车,选中前面有车的这扇门就足以收获该汽车,而此外两扇门后边则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的中间一扇,透露里面一只山羊。主持人其后会问参赛者要不要换另一扇如故关上的门。
题材是:换另一扇门会否扩张参赛者赢得汽车的机会率?

以此古老的题目倘诺提出就挑起了剧烈的争持,有人认为换与不换末了取得车的几率都是1/2,有人以为换门之后拿到车的票房价值更大,应该拔取换门之后得到车的概率为2/3在写作那篇小说的时候在果壳上还有人在为此争吵,知乎上也有不少有关这下面的议论,其实那些争议很多气象下都是因这个题目标歪曲表述所引起的,关键点在于主席对于门后的气象是否精晓

  1. 假设主席事先知道哪位门里有山羊并且他特别接纳了有山羊的门打开了,那么参赛者应该换另一扇门,这足以将他胜利的票房价值从1/3升到2/3
  2. 即使主席事先不知晓哪些门里有山羊或者他只是随意的抉择了一个门,但实际发现中间恰好是山羊。这时候参赛者没有换门的必不可少,胜利概率总是1/2

为了继承的商量,这里运用维基百科上对此这个题目的不马虎的定义

严谨的发挥如下:

  • 参赛者在三扇门中挑选一扇。他并不知道内里有如何。
  • 主席知道每扇门前边有哪些。
  • 主席必须拉开剩下的其中一扇门,并且必须提供换门的机会。
  • 主持人永远都会挑一扇有山羊的门。
    • 一旦参赛者挑了一扇有山羊的门,主持人必须挑另一扇有山羊的门。
    • 只要参赛者挑了一扇有汽车的门,主持人随机在此外两扇门中挑一扇有山羊的门。
  • 参赛者会被问是否维持他的原来采取,依然转而挑选剩下的那一道门。

新能源车,那么这一个问题这足以很好的敞亮了,引用维基的一幅图片解析:

新能源车 2

蒙提霍尔解答

有三种可能的情事,全部都有分外的可能性(1/3):

  • 参赛者挑汽车,主持人挑四头羊的其它一头。转换将破产。
  • 参赛者挑A羊,主持人挑B羊。转换将拿到汽车。
  • 参赛者挑B羊,主持人挑A羊。转换将获取汽车。

因此玩家选拔换门之后赢球的概率应为2/3

证明?

新能源车 3

蒙提霍尔解答

定义:

  • 事件A为一起首玩家选用的一扇门
  • 事件H为终极门后的结果

  • 万一是接纳不换门的国策

因为选用的是不交换的策略,所有只有一起头选中的是汽车,最终才能当选汽车。

  • 挑选交流门的政策

因为选取的是换成的方针,所有只有一从头选中的是羊,最终才能入选汽车。

次第验证

实践是检察真理的唯一标准,在流言终结者看到他们人工重复这个实验区验证,发现这样很浪费时间。何通过电脑去去模拟这一段过程吧?
下边拔取python程序来效仿这一段过程:

from __future__ import division
import logging
from matplotlib import pyplot as plt
import numpy as np
import random


class MontyHall(object):
    """docstring for MontyHall"""

    def __init__(self, num=3):
        """
        创建一个door列表
        0 代表关门
        1 表示后面有车
        -1 代表门被打开
        """
        super(MontyHall, self).__init__()
        self.doors = [0] * num
        self.doors[0] = 1
        self.choice = -1
        self.exclude_car = False
        self.shuffle()

    def shuffle(self):
        """  
        开始新游戏
        重新分配门后的东西
        """
        if self.exclude_car == True:
            self.doors[0] = 1
            self.exclude_car = False
        for i in xrange(len(self.doors)):
            if self.doors[i] == -1:
                self.doors[i] = 0
        random.shuffle(self.doors)

    def make_choice(self):
        """
        player随机选择一扇门
        """
        self.choice = random.randint(0, len(self.doors) - 1)
        logging.info("choice: %d" % self.choice)
        logging.info("original: %s" % self.doors)

    def exclude_doors(self):
        """
        主持人知道门后的情况排除门
        直到剩余两扇门
        """
        to_be_excluded = []
        for i in xrange(len(self.doors)):
            if self.doors[i] == 0 and self.choice != i:
                to_be_excluded.append(i)  
        random.shuffle(to_be_excluded)
        for i in xrange(len(self.doors) - 2):
            self.doors[to_be_excluded[i]] = -1
        logging.info("final: %s" % self.doors)

    def random_exclude_doors(self):
        """
        主持人并不知道门后面的情况随机的开门
        直到剩余两扇门
        """
        to_be_excluded = []
        for i in xrange(len(self.doors)):
            if self.doors[i] != -1 and i != self.choice:
                to_be_excluded.append(i)  
        random.shuffle(to_be_excluded)
        for i in xrange(len(self.doors) - 2):
            if self.doors[to_be_excluded[i]] == 1:
                self.exclude_car = True
            self.doors[to_be_excluded[i]] = -1
        logging.info("final: %s" % self.doors)

    def change_choice(self):
        """
        player改变选择
        """
        to_change = []
        for i in xrange(len(self.doors)):
            if self.doors[i] != -1 and i != self.choice:
                to_change.append(i)
        self.choice = random.choice(to_change)
        logging.info("choice changed: %d" % self.choice)

    def random_choice(self):
        """
        player 第二次随机选择门
        """
        to_select = []
        for i in xrange(len(self.doors)):
            if self.doors[i] != -1:
                to_select.append(i)
        self.choice = random.choice(to_select)
        logging.info("random choice : %d" % self.choice)


    def show_answer(self):
        """
        展示门后的情况
        """
        logging.info(self.doors)

    def check_result(self):
        """
        验证结果
        """
        got_it = False
        if self.doors[self.choice] == 1:
            got_it = True
        return got_it

依傍1000轮,每一轮重复试验1000次

  • 不转移选取:

def unchange_choice_test(n):
    """
    不改变初始的选择
    """
    result = {}
    game = MontyHall()
    for i in xrange(n):
        game.shuffle()
        game.make_choice()
        game.exclude_doors()
        if game.check_result():
            result["yes"] = result.get("yes", 0) + 1
        else:
            result["no"] = result.get("no", 0) + 1
    for key in result:
        print "%s: %d" % (key, result[key])
    return result["yes"] / n

if __name__ == '__main__':
    logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.WARNING)
    results = []
    test_num = 1000
    round_num = 1000
    for x in xrange(0,round_num):
        results.append(change_random_test(test_num) )

    y_mean = np.mean(results)
    y_std = np.std(results)
    x = range(0,round_num)
    y = results
    plt.figure(figsize=(8,4))

    plt.xlabel("round")
    plt.ylabel("frequency")
    plt.title("The frequency of the success")
    tx = round_num / 2
    ty = y_mean
    label_var = "$\sigma \left( X \\right)=$%f" % y_std
    label_mean = "$ X =$%f" % y_mean
    p1_label = "%s and %s" % (label_var,label_mean)
    p1 = plt.plot(x,y,"-",label=p1_label,linewidth=2)
    plt.legend(loc='upper left')


    pl2 = plt.figure(2)
    plt.figure(2)
    plt.hist(results,40,normed=1,alpha=0.8)
    plt.show()

结果:

新能源车 4

此间输入图片的叙述

概率分布:

新能源车 5

那里输入图片的讲述

事业有成的票房价值均值在 1/3 附近

  • 更改采取:

def change_choice_test(n):
    """
    交换选择的门
    """
    result = {}
    game = MontyHall()
    for i in xrange(n):
        game.shuffle()
        game.make_choice()
        game.exclude_doors()
        game.change_choice()
        if game.check_result():
            result["yes"] = result.get("yes", 0) + 1
        else:
            result["no"] = result.get("no", 0) + 1
    for key in result:
        print "%s: %d" % (key, result[key])
    return result["yes"] / n

平等的措施绘图得到结果:

新能源车 6

此地输入图片的叙说

概率分布:

新能源车 7

此处输入图片的描述

得逞的票房价值均值在 2/3 附近

透过地点的解析与模拟可知最佳的方针当然就是换门。

一发深切的座谈

  • 倘使门的数码持续是3个,如假若50扇门呢?

新能源车 8

那里输入图片的讲述

这种情景下,主持人打开48扇都是羊的门后,再给你挑选,很六个人那些时候理应就不会固守这1/2,而会采取换门
把门的数据增大到100,1000,这种状态会进一步显眼。
抑或经过一段程序模拟表明:

def change_choice_test_large(n,m):
    """
    交换选择的门
    """
    result = {}
    game = MontyHall(m)
    for i in xrange(n):
        game.shuffle()
        game.make_choice()
        game.exclude_doors()
        game.change_choice()
        if game.check_result():
            result["yes"] = result.get("yes", 0) + 1
        else:
            result["no"] = result.get("no", 0) + 1
    for key in result:
        print "%s: %d" % (key, result[key])
    return result["yes"] / n


if __name__ == '__main__':
    logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.WARNING)
    results = []
    test_num = 1000
    round_num = 1000
    for x in xrange(0,round_num):
        results.append(change_choice_test_large(test_num,50) )

结果:

新能源车 9

新能源车 10

这时就要拔取交换门

  • 相遇这种情状我很迷惑,我主宰抛硬币决定,那些时候成功的几率?

这是第3种政策,成功的票房价值和硬币有关,也就是1/2,这种景观就是从剩下的门中随机选用一扇,这些策略从地点分析来看不是最好的,不过比不转移的国策要好。
先后的模仿结果:

新能源车 11

此间输入图片的讲述

新能源车 12

那里输入图片的描述

  • 比如门意外打开的情况吧,也就是下边描述的第三种情景(主持在不知门后的事态下打开门呢)?

这种气象下实际就是一个尺码概率,事件A是玩家最终开到的是车,事件B是主持人打开的门是羊。

因为惟有主席开到是羊的景色下,玩家才有可能开到车所以

设玩家首先次采取的门为事件C

  • 不互换策略下的条件概率是:

QQ截图20150510140602.png

  • 换成策略下的尺度概率是:

于是在主持人不知底门后的状况下开辟一扇,然后发现门后是羊的情景下,换门与不换门最后的票房价值都是1/2
或者得以经过程序开展模拟:

def unknown_doors_choice_test(n):
    """
    主持人并不知道门后面的情况随机的开门
    交换选择的门
    """
    result = {}
    game = MontyHall()
    continue_count = 0
    for i in xrange(n):
        game.shuffle()
        game.make_choice()
        game.random_exclude_doors()
        game.change_choice()
        if game.exclude_car == False:
            continue_count += 1
        if game.check_result():
            result["yes"] = result.get("yes", 0) + 1
        else:
            result["no"] = result.get("no", 0) + 1
    #for key in result:
    #    print "%s: %d" % (key, result[key])
    logging.info("continue_count: %d" % continue_count)
    if continue_count == 0:
        return 0.0
    return result["yes"] / continue_count   

新能源车 13

此地输入图片的描述

新能源车 14

此处输入图片的叙述

在这种气象下交流门也尚未晋级成功的几率


总结

今日写的这篇东西也算是理解自我童年的一个缺憾,人的直觉有时候是很不可靠,要摆脱个人局限的回味才能拥抱更大的社会风气。
怎么?看完这多少个分析,你还觉得不顺心那么你还是可以够从下面的参照中检索更好的分析,本文撰写过程有部分的图形引用自一下的参阅,假诺您还有问题欢迎你联系自身更是的座谈。

练习

上面是三门问题的六个翻版,引用自三门问题及相关

女孩的几率

  • 您结交一位新对象,问她是不是有子女。她说有,有多个。你问,有女孩啊?她说有。那么,多少个都是女孩的几率是不怎么?

答:三分之一。因为生五个子女的可能有四种等可能:BB、GG、BG、GB(即男男、女女、男女、女男)。
因为我们已知至少有一个幼女,所以BB是不容许的。因而GG是可能现身的两个等可能的结果之一,所以三个孩子都是姑娘的票房价值为三分之一。这对应了三门问题的首先种状态。

  • 您结交一位新对象,问她是不是有孩子。她说有,有六个。你问,有女孩啊?她说有。第二天,你看见她带了一个小女孩。你问他,这是你孙女吧?她说,是。她的多少个男女都是女孩的概率是稍微?

这一个概率和生女孩的票房价值一样,二分之一。这不啻分外意外,因为我们所独具的新闻看起来并不比第一种状态时多,但概率却今非昔比。可是这里的题材其实是,这一个你没>见过的孩子是女孩的票房价值是不怎么?那么些概率和生女孩的概率一样,二分之一。
这对应了三门题材的第两种情景。当然这里也有语言问题,必须假定那位姑姑不是一定带出一个小女孩来给您看的。也就是说你只是刚刚发现了它是位小女孩。这取决于是判定接纳或q
随机挑选。淌倘诺被您刚好撞见那是属于擅自采用。这就对应了三门题材的第二种情状。这事实上是增多了消息的。否则一旦她积极带一个小女孩过来给您,则属于判断接纳。
你获取的答案看重于所讲的故事;它依靠于您是怎么得知至少一个亲骨肉是女孩的。

三罪人问题

  • Adam、比尔(比尔)和查理被关在一个监狱里,只有监狱看守知道何人会被判死缓,另外两位将会释放。有1/3的几率会被处死刑的Adam,给她小姨写了一封信,想要获释的比尔(比尔)或查理协助代寄。当Adam问看守他应该把她的信交给比尔(Bill)仍旧查理时,那位有着同情心的防卫很为难。他觉得只要他把将要获释的人的名字告诉Adam,那么亚当(Adam)就会有1/2的几率被判死缓,因为剩下的人和亚当(Adam)这五人中势必有一个人被处决。假设她背着这音讯,Adam被行刑的几率是1/3。既然亚当(Adam)知道其他五人中必有一人会释放,那么Adam自己被处决的概率怎么可能会因为看守告诉她任何六个人中被获释者的人名后而更改啊?

没错的答案是:看守不用当心,因为就是把自由人的人名告诉Adam,Adam被行刑的票房价值依旧是1/3,没有改观。可是,剩下的这位没被点名的人就有2/3的几率被行刑(被行刑的可能进步了)。如若这些问题换一种说法,就是防守无意间表露了查尔斯(Charles)不会死。那么几率就会生出变动。
本条实际上和三门问题是一模一样的。你可以把狱卒当成主持人,被处决当成是大奖,那么那些是对应于三门题材的率先种情状,就是主席知道门前面的图景。狱卒说出谁会被释放,相当于主席打开一扇门。可是因为三囚徒问题无法选用,也就相当于三门题材中的不换门的方针。最终的概率仍旧1/3是从未有过暴发改变的。
为了避免生出歧义,规定一下:
1.假使(亚当(Adam),Charles)被放走,那么狱卒会告知Adam:”查尔斯(Charles)被放飞”。
2.万一(Adam,比尔(比尔))被假释,那么狱卒会报告Adam:”比尔(Bill)被放出”
3.假诺(查理,比尔(比尔(Bill)))被放飞,那么狱卒会以1/2的概率告诉Adam:”Charles被假释”或者”比尔被假释”
趣味就很肯定了,在看守说出比尔(比尔(Bill))被放飞的口径下,亚当(Adam)被释放的概率是?用标准概率算一下。
概念事件:

A :狱卒说出”比尔(比尔)被放走”
B :代表Adam被放飞。

新能源车 15

这什么样时候才是1/2的几率呢?
平整3更改为:如若(查理(Charles),比尔(比尔(Bill)))被放走,那么狱卒会报告亚当(Adam)”比尔(比尔)被放飞”
其一时候总括就是:

新能源车 16

这倘使规则3改为:如果(查尔斯(Charles),比尔(Bill))被放走,那么狱卒会报告亚当(Adam)”查尔斯(Charles)被放飞”
本条时候:Adam被假释的几率就会化为1
题材在于规则2和规则3下说”比尔(比尔(Bill))被放飞”不是等概率暴发的。

仿佛的题目还有

  • 抛两枚硬币其中有一枚硬币是纯正,问两枚硬币都是纯正的几率是?
  • 抛两枚硬币其中第一枚硬币是不俗,问两枚硬币都是正经的票房价值是?

the end.


参考:

  1. 蒙提霍尔问题 –
    维基百科,自由的百科全书

  2. 三扇门问题 |
    左岸读书

  3. 蒙提霍尔问题(又称三门题材、山羊汽车问题)的正解是如何?

  4. 趣味编程:三门问题

  5. 三门题材及相关

  1. 换依然不换?争议没有停息过的三门题材

  2. 在「三门问题」中,参加者应该选拔「换」依然「不换」?主持人是否通晓门后意况对结论有何影响?

  3. THE MONTY HALL
    PROBLEM

  4. 流言终结者第九季

  5. 某个家庭中有 2
    个孩子,已知其中一个是女孩,则另一个是男孩的几率是稍稍?-新浪

  6. 从贝叶斯定律的角度通晓“蒙提霍尔题材”和“多少个罪犯问题”

  7. 两个罪犯问题,求解?


改进日志:

  • 2015-05-20 扩展三囚徒问题的解答
  • 2015-05-09 第一次作文
网站地图xml地图