蒙特霍尔问题的c#程序演示
蒙特霍尔问题:
蒙提霍尔问题是一档由霍尔(Hall)主持的游戏节目:
让我们来做交易(Let's Make a Deal)中,竞争者面临生死抉择。
这个问题是1990年9月9日由马里兰州哥伦比亚的克雷格·惠特克(Craig Whitaker)提出的。
“亲爱的玛丽莲,”惠特克写道。
“如果你在这个游戏节目中,你面临三道门的选择,一扇门后面是一辆车,其它两扇门后面是山羊,你选择了一扇门,假设是一号,而知道门后面是什么的主持人打开另一扇门,假设是三号,门后面有一只山羊。
他对你说:‘你想选择二号门吗?'你转变选择对你是否有利呢?”
此问题在90年代非常出名,一般对此问题有两种解释
1、莎凡提的解释
答案的关键在于主持人的作用,他将总是选择背后没有奖品的门。游戏的统计显示,通常转变选择的人是不转变的人赢率的2倍。统计证实了莎凡特在她的第三期专栏中的解释:“当你第一次从3个门中选择一号,后面有奖品的机会是1/3,奖品在其它两扇门中的一扇中的机会是2/3。但随后,主持人介入,并给了你一条线索。如果奖品在二号门后面,主持人会给你看三号门,而如果奖品在三号门后面,主持人给你看二号门。所以,当你转变选择,如果奖品在二号门后或在三号门后,你赢,两种可能你都会赢!但如果你不转变,只有当奖品在一号门后面,你才能赢。”
2、
由于之前选择门的时候是随机的。因此尽管之后主持人打开了一个不含汽车的门,对你的选择没有任何影响。所以换与不换的概率应该是相等的。
现在一般的解释是第一种解释,但是我认为第二种解释才是真正正确的解释,废话不说,程序解释
1 using System;
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
证明,第一种解释完全是无稽之谈!
换与不换完全不影响最终结果。