Monty Hall悖论又称为蒙提·霍尔悖论、三门问题。Monty Hall是上个世纪60年代,电视游戏节目“Let's Make a Deal”的主持人,这个悖论便是以他的名字来命名的。节目的规则是这样的:

Monty向你展示三个关闭的大门,其中一扇门背后有一辆车,另两扇门背后是一头山羊。

[1]

参与节目的观众会穿着奇装异服,希望Monty能够选中自己。

首先你可以任意选择一扇门,当然你有1/3的概率选中背后有车的门。

这时Monty会打开另一扇,他知道后面没有车(这是一个极其需要注意的细节),并询问你是否需要改变你的选择。

Monty知道那扇门背后有车,你认为他是设计让你没法得到车,还是在帮你呢?这时台下的观众也会乱作一团,各自嚷嚷着自己的猜想。

到底应该坚持自己最初的选择,还是改变自己的选择呢,如果你是在考试结束的前一分钟,我想你应当坚持自己的选择。

作为聪明的你,如果你一开始胡乱动用自己的情感,你就已经输了。要想得到正确的结论,必须依靠理性。

1 分析所有可能发生的情况

一开始,如果不知道开始从哪儿开始思考,不妨假设所有可能发生的情况。

不失一般性,假设车出现在1号门后

你选择了1号门,Monty会随机打开2号或3号门,这时应坚持自己的选择选择

你选择了2号门,1号门背后有车,Monty只能打开3号门,这是应该改变自己的选择

你选择了3号门,根选择2号门的情况完全相同

[2]

你看,1/3的情况坚持自己的选择能够得到车,2/3的情况改变自己的选择能够得到车

所以你应当改变自己的选择

2 使用随机变量分析

要使用概率论来分析,最重要的是明确随机变量是什么。你必须以第三者视角俯视这个问题,

车的位置一定是随机的,你的选择也是随机的,Monty的选择呢,有时他迫不得已只有一个选择,有时他有可以从两扇门里,随意选择一张,所以还是随机的

假设,随机变量X代表你的选择、随机变量Y代表Monty打开的门、随机变量Z代表真实车的位置

三个随机变量的取值,均为A、B或C,代表三扇门

还有,随机变量X与随机变量Z是相互独立的,因为你不知道车在哪

问题应当描述成,你选择了门A,Monty打开了门B,求车位于门C的概率,也就是改变选择得到车的概率。并没有失去一般性

得出的结果是,2/3的概率改变你的选择能够得到车

3 计算机仿真

如果你对概率没有兴趣,认为概率虚无缥缈,仍然有办法可以解救你,那就是计算机仿真。这里会使用Python编程语言,来模拟这一过程。

你只需要用三个随机数,模拟上一种方法说明的三个随机变量,然后统计坚持选择得到车和改变选择得到车的次数就能得到分布。

def montyChoose(guessDoor, prizeDoor):
if 1 != guessDoor and 1 != prizeDoor:
return 1
if 2 != guessDoor and 2 != prizeDoor:
return 2
return 3

此函数用于模拟Monty的选择,一个简单的逻辑就是,Monty只能选你没有选的门,同时又没有车的门

def simMontyHall(numTrials):
stickWins, switchWins, noWin = (0, 0, 0)
for t in range(numTrials): #进行numTrails次实验
prizeDoor = random.choice([1, 2, 3]) #随机生成车所在的门
guess = random.choice([1, 2, 3]) #随机生成你的选择
toOpen = montyChoose(guess, prizeDoor)
if toOpen == prizeDoor: #模拟Monty的选择 这种情况并不会发生
noWin += 1
elif guess == prizeDoor:
stickWins += 1
else:
switchWins += 1
return (stickWins, switchWins)

将函数返回的结果画成饼状图

得到的结果和上面仍然是一致的。

在最开始介绍节目的游戏规则时,我特意强调了,Monty知道车的位置很重要,Monty会避开选中车

如果Monty并不知道车在哪,随机打开一个门呢,这时他有可能自己打开背后有车的门,但并不会直接打开你选择的门

修改一下上面的选择函数为随机选择,就可以模拟这种新的情况

def randomChoose(guessDoor, prizeDoor):
if guessDoor == 1:
return random.choice([2,3])
if guessDoor == 2:
return random.choice([1,3])
return random.choice([1,2])

这样,不论你是否修改你的选择,并没有区别

全部代码:

import pylab
import random def montyChoose(guessDoor, prizeDoor):
if 1 != guessDoor and 1 != prizeDoor:
return 1
if 2 != guessDoor and 2 != prizeDoor:
return 2
return 3 def randomChoose(guessDoor, prizeDoor):
if guessDoor == 1:
return random.choice([2,3])
if guessDoor == 2:
return random.choice([1,3])
return random.choice([1,2]) def simMontyHall(numTrials, chooseFcn):
stickWins, switchWins, noWin = (0, 0, 0)
prizeDoorChoices = [1,2,3]
guessChoices = [1,2,3]
for t in range(numTrials):
prizeDoor = random.choice([1, 2, 3])
guess = random.choice([1, 2, 3])
toOpen = chooseFcn(guess, prizeDoor)
if toOpen == prizeDoor:
noWin += 1
elif guess == prizeDoor:
stickWins += 1
else:
switchWins += 1
return (stickWins, switchWins) def displayMHSim(simResults, title):
stickWins, switchWins = simResults
pylab.pie([stickWins, switchWins],
colors = ['r', 'c'],
labels = ['stick', 'change'],
autopct = '%.2f%%')
pylab.title(title) simResults = simMontyHall(100000, montyChoose)
displayMHSim(simResults, 'Monty Chooses a Door')
pylab.figure()
simResults = simMontyHall(100000, randomChoose)
displayMHSim(simResults, 'Door Chosen at Random')
pylab.show()

[3]

十分感谢,MIT的计算机编程导论公开课,他为我打开了新的一扇门

如果想更深入了解这个问题,或是想具体了解如何用计算机模拟其他的问题,可以阅读《编程导论》,那门公开课的教材最近被翻译成了中文。

决战21点,我最喜欢的电影之一,Micky教授就是通过这个问题,发现Ben在数学上面的天赋的。

(右键选择播放)

脑袋跟不上来哇,我希望你明白了我的解释。

参考资料:

[1-2] https://zh.wikipedia.org/wiki/%E8%92%99%E6%8F%90%E9%9C%8D%E7%88%BE%E5%95%8F%E9%A1%8C

[3] John V. Guttag. Introduction to Computation and Programming Using Python. The MIT Press. 2013.

Monty Hall悖论的更多相关文章

  1. 羊和汽车问题(或s三门问题(Monty Hall problem)亦称为蒙提霍尔问题)

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

  2. 用贝叶斯定理解决三门问题并用Python进行模拟(Bayes' Rule Monty Hall Problem Simulation Python)

    三门问题(Monty Hall problem)也称为蒙提霍尔问题或蒙提霍尔悖论,出自美国的电视游戏节目<Let’s Make a Deal>.问题名字来自该节目的主持人蒙提·霍尔(Mon ...

  3. Monty Hall Problem (三门问题)

    最近有点忙,没怎么写程序...今天突然想起以前看到过的一个问题-三门问题,十分想用程序来模拟一下,于是实在忍不住了就模拟了这个游戏的实验,通过写程序更加加深了我对这个问题的理解,期间也查找了各种相关资 ...

  4. The Monty Hall Problem

    GNG1106 Lab 3The Monty Hall ProblemBackgroundThe Monty Hall Problem is a famous probability puzzle, ...

  5. sql server:Monty Hall problem (蒙提霍尔问题)

    --------------------------------------------------------------------- -- Auxiliry Table of Numbers 数 ...

  6. Monty Hall 问题与贝叶斯定理的理解

     三门问题(Monty Hall problem),是一个源自博弈论的数学游戏问题,大致出自美国的电视游戏节目Let's Make a Deal.问题的名字来自该节目的主持人蒙提·霍尔(Monty H ...

  7. 回顾 Monty Hall (三门问题)

    一.问题描述 Monty Hall Problem 源于美国的一档电视节目<Let's Make a Deal>,其中Monty Hall 是这个节目的主持人. 节目中有三扇门1.2.3, ...

  8. Monty 大厅问题(Monty Hall Problem)也称作三门问题,出自美国大型游戏节目 Let's Make a Deal。

    Monty 大厅的问题陈述十分简单,但是它的答案看上去却是有悖常理.该问题不仅引起过很多争议,也经常出现在各种考试题中. Monty 大厅的游戏规则是这样的,如果你来参加这个节目,那么 (1)Mont ...

  9. Monty Hall Problem的一个图解,感觉不错

    从Coursera.org上的台大概率课讨论组里拿来的 如果不转换,选中汽车的概率是1/3,非常显然. 但转换后选中汽车的概率变成2/3就有点反直觉了,并不是太容易想明白. 因为转换其实有4种:汽车- ...

随机推荐

  1. 2017-7-18-每日博客-关于Linux下的鲜为人知的10条命令.doc

    这篇文章的目的是介绍一些少有人知的Linux命令,它们一定会高效地帮你管理你的桌面/服务器. 1. sudo !!命令 没有特定输入sudo命令而运行,将给出没有权限的错误.那么,你不需要重写整个命令 ...

  2. 2018 BAT最新《前端必考面试题》

    2018 BAT最新<前端必考面试题> 1.Doctype作用? 严格模式与混杂模式如何区分?它们有何意义? (1). 声明位于文档中的最前面,处于 标签之前.告知浏览器的解析器,用什么文 ...

  3. Codeforces Round #345 (Div. 2) B

    B. Beautiful Paintings time limit per test 1 second memory limit per test 256 megabytes input standa ...

  4. TextToast -- 自定义Toast源码

    import android.content.Context;import android.graphics.Color;import android.graphics.PixelFormat;imp ...

  5. 02.树的序列化与反序列化(C++)

    1.二叉树的序列化 输入的一棵树: //二叉树的先序遍历-序列化 #include <iostream> #include <string> #include <sstr ...

  6. javascript常用实例的实现与封装

    地址:https://github.com/chenhuiYj/ec-do 2.字符串操作 2-1去除字符串空格 //去除空格  type 1-所有空格  2-前后空格  3-前空格 4-后空格 fu ...

  7. oracle重新编译失效对像

    重新编译失效对像可执行utlrp.sql文件: SQL> @?/rdbms/admin/utlrp.sql TIMESTAMP --------------------------------- ...

  8. js对数组的常用操作

    在js中对数组的操作是经常遇到的,我呢在这就列一下经常用到的方法 删除数组中的元素: 1.delete方法:delete删除的只是数组元素的值,所占的空间是并没有删除的 代码: var arr=[12 ...

  9. python 面试题(1)

    好用简洁的大数据技术:python.hadoop.R 慢慢学习,随时分享 1.什么是Python?使用Python有什么好处? Python是一种编程语言,它有对象.模块.线程.异常处理和自动内存管理 ...

  10. [洛谷P1707] 刷题比赛

    洛谷题目连接:刷题比赛 题目背景 nodgd是一个喜欢写程序的同学,前不久洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情,他就打算用这些事情来出题恶心大家-- ...