专栏首页小浩算法漫画:跑上百万次代码验证三门问题

漫画:跑上百万次代码验证三门问题

三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,出自美国的电视游戏节目Let's Make a Deal。今天为大家进行完整分析。

话不多说,直接看题目。

01 三门问题

三门问题:参赛者的面前有三扇关闭着的门,其中一扇的后面是天使,选中后天使会达成你的一个愿望,而另外两扇门后面则是恶魔,选中就会死亡。

当你选定了一扇门,但未去开启它的时候,上帝会开启剩下两扇门中的一扇,露出其中一只恶魔。(上帝是全能的,必会打开恶魔门)随后上帝会问你要不要更换选择,选另一扇仍然关着的门。

02 普通人的直觉

按照常理,参赛者在做出最开始的决定时,对三扇门后面的事情一无所知,因此他选择正确的概率是1/3,这个应该大家都可以想到。

接下来,主持人排除掉了一个错误答案(有恶魔的门),于是剩下的两扇门必然是一扇是天使,一扇是恶魔,那么此时无论选择哪一扇门,胜率都是1/2,依然合乎直觉。

所以你作为参赛者,你会认为换不换都无必要,获胜概率均为1/2。但是,真的是这样吗?

03 题目分析

正确的答案是,如果你选择了换,碰见天使的概率会高达2/3,而不不换的话,碰见天使的概率只有1/3。怎么来的?

我们用一个很通俗的方法,能让你一听就懂。首先刚开始选择的一扇门的概率为1/3,而另外两扇门的总概率为2/3。

现在上帝打开了其中一扇为恶魔的门,我们知道这个门后面不会再有天使,所以相当于这部分概率被第三个门持有。

剩下的那扇门的概率(2/3)相当于刚开始选择的门(1/3)的二倍。所以我们得换。

如果还没有听懂。我们可以假设有一百扇门,里边有99只都是恶魔。现在你随机选择一扇门,选择到天使的概率是1/100。

这时,上帝打开其中的98扇,里边都是恶魔。这时候就相当于99/100的概率都集中在了另一扇门里。自然,我们需要选择换。

04 贝叶斯证明 代码证明

为了验证结果,我用代码跑了一百万次。什么?用贝叶斯分析分析!太俗(请隔壁去找李永乐老师),咱们还是直接上代码。

func main() {
    //换门遇见天使的次数和不换门遇见天使的次数
    changeAngelCount, unchangeAngelCount := 0, 0
    for i := 0; i < 1000000; i++ {
        //门的总数
        doors := []int{0, 1, 2}
        //天使门和选中的门
        angelDoor, selectedDoor := rand.Intn(3), rand.Intn(3)
        //上帝移除一扇恶魔门
        for j := 0; j < len(doors); j++ {
            if doors[j] != selectedDoor && doors[j] != angelDoor {
                doors = append(doors[:j], doors[j+1:]...)
                break
            }
        }
        //统计
        if selectedDoor == angelDoor {
            unchangeAngelCount++
        } else {
            changeAngelCount++
        }
    }
    fmt.Println("不换门遇见天使次数:", unchangeAngelCount, "比例:", (float32(unchangeAngelCount) / 1000000))
    fmt.Println("换门遇见天使次数:", changeAngelCount, "比例:", (float32(changeAngelCount) / 1000000))
}

跑了一百万次,结果当然不让我们失望!

所以,今天的问题你听明白了吗?评论区留下你的想法吧!

本文分享自微信公众号 - 小浩算法(xuesuanfa),作者:程序员浩哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 漫画:经典鹅厂面试题(4sum - nSum)

    第18题:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + ...

    程序员小浩
  • 漫画:经典鹅厂面试题(2Sum,3Sum,4Sum)

    该题为 二数之和 的进阶版本,当然还有一个进阶版本为 四数之和。我们将会一一进行分析!

    程序员小浩
  • 漫画:常考的荷兰国旗问题你还不会吗?(初级)

    "荷兰国旗问题" 是计算机科学中的一个经典题目,它是由Edsger Dijkstra提出的。荷兰国旗由红、白、蓝三色组成。

    程序员小浩
  • 跑上百万次代码,终于把三门问题验证了

    三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,出自美国的电视游戏节目Let's Make a Deal。今天为大...

    帅地
  • 史上最全Kubernetes资料集萃!菜鸟变高手这一篇就够了

    Kubernetes是一个全新的基于容器技术的分布式架构领先方案, 它是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kuberne...

    小小科
  • 0767-Hive ACID vs. Delta Lake

    Qubole现在支持对存储在Cloud数据湖中的数据进行高效的Update和Delete。用户可以对开启了事务的Hive表进行insert,update和del...

    Fayson
  • Go语言可用几种消息通讯方案

    mangos  基于SP/nanomsg 协议,比较难用。 ProtoActor 类似Erlang的实现,比较新,完备度较低,但是性能还不错。 最近又多了一个选...

    Linker
  • 比赛必备 ︱ 省力搞定三款词向量训练 + OOV词向量问题的可性方案

    glove: NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&python实现、相关应用) 极简使用︱Glove-python词向量训练...

    素质
  • 关于Kinetics-700人类行为数据集的简短说明

    作者:Joao Carreira,Eric Noland,Chloe Hillier,Andrew Zisserman

    空白的小飞机
  • P04_zookeeper-cdh5集群搭建

    安装ZooKeeper包 [CDH下载地址](http://archive.cloudera.com/cdh5/cdh/5/) 1、将课程提供的zookeepe...

    Albert陈凯

扫码关注云+社区

领取腾讯云代金券