蒙特霍尔问题的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( 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

 

 

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

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

你可能感兴趣的:(C#)