蒙特霍尔问题的c#程序演示

蒙特霍尔问题: 

蒙提霍尔问题是一档由霍尔(Hall)主持的游戏节目:

让我们来做交易(Let's Make a Deal)中,竞争者面临生死抉择。

这个问题是1990年9月9日由马里兰州哥伦比亚的克雷格·惠特克(Craig Whitaker)提出的。

“亲爱的玛丽莲,”惠特克写道。

“如果你在这个游戏节目中,你面临三道门的选择,一扇门后面是一辆车,其它两扇门后面是山羊,你选择了一扇门,假设是一号,而知道门后面是什么的主持人打开另一扇门,假设是三号,门后面有一只山羊。

他对你说:‘你想选择二号门吗?'你转变选择对你是否有利呢?” 

 

此问题在90年代非常出名,一般对此问题有两种解释

1、莎凡提的解释 

答案的关键在于主持人的作用,他将总是选择背后没有奖品的门。游戏的统计显示,通常转变选择的人是不转变的人赢率的2倍。统计证实了莎凡特在她的第三期专栏中的解释:“当你第一次从3个门中选择一号,后面有奖品的机会是1/3,奖品在其它两扇门中的一扇中的机会是2/3。但随后,主持人介入,并给了你一条线索。如果奖品在二号门后面,主持人会给你看三号门,而如果奖品在三号门后面,主持人给你看二号门。所以,当你转变选择,如果奖品在二号门后或在三号门后,你赢,两种可能你都会赢!但如果你不转变,只有当奖品在一号门后面,你才能赢。” 

2、

由于之前选择门的时候是随机的。因此尽管之后主持人打开了一个不含汽车的门,对你的选择没有任何影响。所以换与不换的概率应该是相等的。

 

 现在一般的解释是第一种解释,但是我认为第二种解释才是真正正确的解释,废话不说,程序解释

 

   1 using System;

  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(02)] = "汽车";
 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(02);
 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(01== 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

 

 

证明,第一种解释完全是无稽之谈!

换与不换完全不影响最终结果。 

posted @ 2009-11-17 01:06  elite_lcf  阅读(2233)  评论(17编辑  收藏  举报
知识共享许可协议
本博客采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。