三门问题,又称蒙提霍尔问题我很久以前就在网上看到过,但是一直对于网上流传的各种复杂的概率解释没什么兴趣,也一直没有想明白。昨天跟朋友突然说起这个问题,起因是虎扑的这个帖子试图用蒙特卡罗模拟来实验一下(可惜的是,这个程序写的有点小错误,不知道你发现没有),也激发了我想来用程序模拟一下的想法,没想到思考了一会之后发现从逻辑的角度来说可以非常简单的解释和理解,不需要任何概率统计的知识(或者说,小学水平?)。

问题

参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车或者是奖品,选中后面有车的那扇门就可以赢得该汽车或奖品,而另外两扇门后面则各藏有一只山羊或者是后面没有任何东西。当参赛者选定了一扇门,但未去开启它的时候,知道门后情形的节目主持人会开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率?

以上问题描述摘自维基百科。

首先有一点可以明确:如果参赛者不更换的话,那么他选中汽车的概率是1/3,这与主持人做了什么完全无关。所以我们现在要考虑的是参赛者会更换选择的情况,也就是说,我们假定参赛者在主持人开门后一定会更换选择。

穷举?

我昨天在一开始思考的时候,因为只有三扇门,所以很自然地想到了穷举这个万金油解法:

  1. 假设两者羊是不同的(羊A,羊B),这样是为了思考起来更清晰
  2. 那么初始的排列情况便是3的全排列,3×2×1=6种
  3. 一开始选手从三扇门里面随机选择一扇,于是有3×6=18种情况,其中12种选中了羊,6种选中了车
  4. 如果选手运气比较差一开始选中了羊,那么主持人只能打开另一扇有羊的门,所以依然是12种情况,更换后选中车
  5. 如果选手一开始选中了车,那么主持人就有两种开门选择(羊A/羊B),所以有6×2=12种情况,更换后选中羊
  6. 所以更换选择后选中车的概率是12/24=1/2。嗯?

如果你看过这个问题的答案的话,就会知道1/2这个答案是错误的,然而错在那里了呢?我在昨天洗澡的时候想通了这个问题(我发现洗澡的时候经常能想通一些问题)。本文的读者如果不明白的话可以先思考一下,我后面再解释错在哪里。

Coding

Talk is cheap. Show me the code.

后来我尝试写程序来模拟一下结果,在构思程序的时候发现一个关键问题:什么情况下会在变换选择后会选到汽车?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from random import choice

# Number of cycles that the player changes to the car
change_to_right = 0
cycles = 10000

for i in range(0, cycles):
doors = [0, 0, 0]
index = [0, 1, 2]
car = choice(index)

choose = choice(index)
# PROBLEM
if ?:
change_to_right += 1

print(float(change_to_right) / float(cycles))

参赛者在第一次选择之后,有两种情况,选中车(1/3),选中羊(2/3),再来分情况讨论一下:

  1. 如果第一次选中了车,那么主持人打开一扇门之后,剩下的一扇门里面也是羊,此时如果更换选择(我们已经假设一定会),则肯定会选到羊
  2. 如果第一次选中了羊,那么主持人只能打开另一扇有羊的门,此时更换选择,则肯定会选到车

到这里就很清楚了,如果第一次没选中,则更换后就会选中(2/3),如果第一次选中,则更换后就不会选中(1/3)。因此更换选择选中车的概率是2/3。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from random import choice

# Number of cycles that the player changes to the car
change_to_right = 0
cycles = 10000

for i in range(0, cycles):
doors = [0, 0, 0]
index = [0, 1, 2]
car = choice(index)

choose = choice(index)
if choose != car:
change_to_right += 1

print(float(change_to_right) / float(cycles))

那么穷举错在哪里?

聪明的读者应该已经发现前文的穷举法错在哪里,问题就在于最后计算概率的时候

  1. 所以更换选择后选中车的概率是12/24=1/2。

这里24是12+12得来的。然而这么计算是有前提的,就是这24种情况是等概率的(概率都忘光了,应该是这么说吧),结果错误的原因就是这24种情况不等概率。

  1. 如果选手运气比较差一开始选中了羊,那么主持人只能打开另一扇有羊的门,所以依然是12种情况,更换后选中车
  2. 如果选手一开始选中了车,那么主持人就有两种开门选择(羊A/羊B),所以有6×2=12种情况,更换后选中羊

在第四步中,主持人其实也有两种选择(所以如果不考虑门后是车还是羊的话,应该有18×2=36种最终情况),但是其中一种打开是车,主持人会回避掉这种情况,这就使第四步中那12种情况的出现概率翻倍了(原本的概率+主持人打开有车的门的概率),因此选中车的概率仍然是(12×2)/(12×2+12)=2/3。