蒙特霍尔问题:
蒙提霍尔问题是一档由霍尔(Hall)主持的游戏节目:
让我们来做交易(Let's Make a Deal)中,竞争者面临生死抉择。
这个问题是1990年9月9日由马里兰州哥伦比亚的克雷格·惠特克(Craig Whitaker)提出的。
“亲爱的玛丽莲,”惠特克写道。
“如果你在这个游戏节目中,你面临三道门的选择,一扇门后面是一辆车,其它两扇门后面是山羊,你选择了一扇门,假设是一号,而知道门后面是什么的主持人打开另一扇门,假设是三号,门后面有一只山羊。
他对你说:‘你想选择二号门吗?'你转变选择对你是否有利呢?”
此问题在90年代非常出名,一般对此问题有两种解释
1、莎凡提的解释
答案的关键在于主持人的作用,他将总是选择背后没有奖品的门。游戏的统计显示,通常转变选择的人是不转变的人赢率的2倍。统计证实了莎凡特在她的第三期专栏中的解释:“当你第一次从3个门中选择一号,后面有奖品的机会是1/3,奖品在其它两扇门中的一扇中的机会是2/3。但随后,主持人介入,并给了你一条线索。如果奖品在二号门后面,主持人会给你看三号门,而如果奖品在三号门后面,主持人给你看二号门。所以,当你转变选择,如果奖品在二号门后或在三号门后,你赢,两种可能你都会赢!但如果你不转变,只有当奖品在一号门后面,你才能赢。”
2、
由于之前选择门的时候是随机的。因此尽管之后主持人打开了一个不含汽车的门,对你的选择没有任何影响。所以换与不换的概率应该是相等的。
现在一般的解释是第一种解释,但是我认为第二种解释才是真正正确的解释,废话不说,程序解释
1 using System;
Code
2
using
System.Collections.Generic;
3
using
System.Linq;
4
using
System.Text;
5
6
namespace
MontyHallproblem
7
{
8
///
<summary>
9
///
此程序用于演示蒙特霍尔问题
10
///
</summary>
11
class
Program
12
{
13
static
void
Main(
string
[] args)
14
{
15
Console.WriteLine(
"
\t此程序用于演示蒙特霍尔问题:
"
);
16
Program p
=
new
Program();
17
int
c
=
0
,uc
=
0
,num
=
1000
;
18
while
(num
>
0
)
19
{
20
if
(p.Run()
==
1
)
21
c
++
;
22
else
23
uc
++
;
24
num
--
;
25
}
26
Console.WriteLine(
"
改变选择中奖的次数是:{0};\n不改变选择中奖的次数是:{1}
"
, c, uc);
27
}
28
private
int
Run()
29
{
30
string
[] doors
=
new
string
[
3
];
31
//
随机doors,在某一个后放置汽车;
32
Random rd
=
new
Random();
33
doors[rd.Next(
0
,
2
)]
=
"
汽车
"
;
34
for
(
int
i
=
0
; i
<
3
; i
++
)
35
{
36
if
(doors[i]
==
null
)
37
doors[i]
=
"
山羊
"
;
38
}
39
//
让客户选一个门
40
Console.WriteLine(
"
Now,you can choose one door to get the car!\nplease input the number of the door.(from 0 to 2)
"
);
41
int
inputNum;
42
//
while (true)
43
//
{
44
//
inputNum = int.Parse(Console.ReadLine());
45
//
if (inputNum < 0 || inputNum > 2)
46
//
Console.WriteLine("input error! please try again.");
47
//
else
48
//
break;
49
//
}
50
inputNum
=
rd.Next(
0
,
2
);
51
//
在告诉最终答案之前,把一个非车的门打开
52
int
openedDoor
=
0
;
53
for
(
int
i
=
0
; i
<
3
; i
++
)
54
{
55
if
(i
!=
inputNum)
56
{
57
if
(doors[i]
!=
"
汽车
"
)
58
{
59
Console.WriteLine(
"
behind door {0} is not a car
"
, i);
60
openedDoor
=
i;
61
break
;
62
}
63
}
64
}
65
//
告诉用户是否重新选择
66
//
Console.WriteLine("Now,a door opened. there is not a car here!Would you change you choose?(Y/N)");
67
//
char changeOrNot = Console.ReadKey().KeyChar;
68
char
changeOrNot
=
'
n
'
;
69
if
(rd.Next(
0
,
1
)
==
1
)
70
changeOrNot
=
'
y
'
;
71
bool
changed
=
false
;
//
指示是否修改过选择
72
if
(changeOrNot
==
'
Y
'
||
changeOrNot
==
'
y
'
)
73
{
//
改变选择
74
changed
=
true
;
75
for
(
int
i
=
0
; i
<
3
; i
++
)
76
{
77
if
(i
!=
inputNum
&&
i
!=
openedDoor)
78
inputNum
=
i;
79
}
80
}
81
82
//
揭示最终答案
83
if
(doors[inputNum]
==
"
汽车
"
)
84
{
85
Console.WriteLine(
"
恭喜!中奖了,汽车一辆!
"
);
86
if
(changed)
87
return
1
;
88
else
89
return
0
;
90
}
91
else
92
{
93
Console.WriteLine(
"
很遗憾!
"
);
94
if
(changed)
95
return
0
;
96
else
97
return
1
;
98
}
99
}
100
101
}
102
}
103
执行程序之后,我提取了5组数据:
次数 改变选择 不改变选择
1 518 482
2 520 480
3 490 506
4 484 516
5 493 507
证明,第一种解释完全是无稽之谈!
换与不换完全不影响最终结果。