蒙提霍尔三门问题

  蒙提霍尔三门问题亦称蒙提霍尔悖论

问题描述

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

思路解析

  1. 三扇门,只有一扇门后有有汽车,其余的为山羊
  2. 汽车事前等可能放置到三扇门中的其中一个
  3. 参赛者等可能选择其中一扇,挑选前不知道门后有什么
  4. 主持人清楚的知道门后有什么
  5. 如果参赛者挑选了一扇有山羊的门,则主持人必须打开另一扇有山羊的门
  6. 如果参赛者挑选了有汽车的门,主持人等可能在另外两扇有山羊的门选择一扇打开
  7. 参赛者会被问保持原先选择还是转而选择另一扇门

Python模拟以上过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
""" @author zhangbohan.dell@gmail.com
@function: 蒙提霍尔三门问题
@create 2018/9/27 10:09"""

import random


def MontyHall(Dselect, Dchange):
Dcar = random.randint(1, 3) # 随机等可能放置汽车
if Dcar == Dselect and Dchange == 0: # 一开始选中并且没有改变选择
return 1
elif Dcar != Dselect and Dchange == 0: # 一开始没选中也没有改变选择
return 0
elif Dcar == Dselect and Dchange == 1: # 一开始选中并且改变选择
return 0
else: # 一开始没选中并且改变选择
return 1


n = 10000
win = 0
for i in range(n):
select = random.randint(1, 3)
win += MontyHall(select, random.randint(0, 1))
print("不确认是够改变选择{}".format(float(win / n)))

win = 0
for i in range(n):
select = random.randint(1, 3)
win += MontyHall(select, 0)
print("确认不改变选择{}".format(float(win / n)))

win = 0
for i in range(n):
select = random.randint(1, 3)
win += MontyHall(select, 1)
print("确认改变选择{}".format(float(win / n)))