题目

蒙提霍尔问题，亦称为蒙特霍问题或三门问题（英文：Monty Hall problem），是一个源自博弈论的数学游戏问题，大致出自美国的电视游戏节目Let’s Make a Deal。问题的名字来自该节目的主持人（Host）蒙蒂·霍尔。
https://zh.wikipedia.org/wiki/%E8%92%99%E6%8F%90%E9%9C%8D%E7%88%BE%E5%95%8F%E9%A1%8C

这个游戏的玩法是：参赛者（Contestants / You）会看见三扇关闭了的门，其中一扇的后面有一辆汽车或者是奖品，选中后面有车的那扇门就可以赢得该汽车或奖品，而另外两扇门后面则各藏有一只山羊或者是后面没有任何东西。当参赛者选定了一扇门，但未去开启它的时候，知道门后情形的节目主持人会开启剩下两扇门的其中一扇，露出其中一只山羊。
主持人其后会问参赛者要不要换另一扇仍然关上的门。
问题是：换另一扇门会否增加参赛者赢得汽车的机会率？
如果严格按照上述的条件的话，答案是会。换门的话，赢得汽车的机率是2/3。

这条问题亦被叫做蒙提霍尔悖论：虽然该问题的答案在逻辑上并不自相矛盾，亦不违反直觉。这问题曾引起一阵热烈的讨论。


Mueser和Granberg透过在主持人的行为身上加上明确的限制条件，提出了对这个问题的一种不含糊的陈述：
	参赛者在三扇门中挑选一扇。他并不知道内里有什么。
	主持人知道每扇门后面有什么。
	主持人必须开启剩下的其中一扇门，并且必须提供换门的机会。
	主持人永远都会挑一扇有山羊的门。
		如果参赛者挑了一扇有山羊的门，主持人必须挑另一扇有山羊的门。
		如果参赛者挑了一扇有汽车的门，主持人随机（概率均匀分布）在另外两扇门中挑一扇有山羊的门。
	参赛者会被问是否保持他的原来选择，还是转而选择剩下的那一道门。
转换选择可以增加参赛者的机会吗？

情况1：主持人不知情（随机去掉错误选项）

1.1 保持原选择不变 + 在剩余的选项中重新选择

(*编程语言：Mathematica*)
(*为了更直接的表达编程思路，程序未做优化*)
n=100000;(*随机模拟次数*)
k=3;(*选项数量*)
options=Range[k];(*初始选项*)

sample=Flatten[{
#,(*正确选项*)
RandomSample[options](*你的选项，主持人的选项，剩余选项__*)
}]&/@RandomInteger[{1,k},n];(*样本*)

(* ======== 统计 ======== *)

(* -------- 保持原选择不变 -------- *)
Length[Cases[sample,{right_,you_,host_,rest__}/;right≠host(*主持人选择错误*)&&right==you(*你选择正确*)]]/Length[Cases[sample,{right_,you_,host_,rest__}/;right≠host(*主持人选择错误*)]]//N

(* -------- 在剩余的选项中重新选择 -------- *)
Length[Cases[sample,{right_,you_,host_,rest__}/;right≠host(*主持人选择错误*)&&right==RandomChoice[Flatten[{rest}]](*你在剩余选项中随机选择，并且选择正确*)]]/Length[Cases[sample,{right_,you_,host_,rest__}/;right≠host(*主持人选择错误*)]]//N

情况2：主持人知情（故意去掉错误选项）

2.1 保持原选择不变 + 在剩余的选项中重新选择

(*编程语言：Mathematica*)
(*为了更直接的表达编程思路，程序未做优化*)
n=100000;(*随机模拟次数*)
k=3;(*选项数量*)
options=Range[k];(*初始选项*)

sample=Flatten[{
#,(*正确选项*)
your=RandomChoice[options],(*你的选项*)
host=RandomChoice[Complement[options,{your,#}]],(*主持人的选项*)
RandomSample[Complement[options,{your,host}]](*剩余选项__*)
}]&/@RandomInteger[{1,k},n];(*样本*)

(* ======== 统计 ======== *)
(* -------- 保持原选择不变 -------- *)
Length[Cases[sample,{right_,you_,host_,rest__}/;right≠host(*主持人选择错误*)&&right==you(*你选择正确*)]]/Length[Cases[sample,{right_,you_,host_,rest__}/;right≠host(*主持人选择错误*)]]//N

(* -------- 在剩余的选项中重新选择 -------- *)
Length[Cases[sample,{right_,you_,host_,rest__}/;right≠host(*主持人选择错误*)&&right==RandomChoice[Flatten[{rest}]](*你选择正确*)]]/Length[Cases[sample,{right_,you_,host_,rest__}/;right≠host(*主持人选择错误*)]]//N