zoukankan      html  css  js  c++  java
  • 蒙特霍尔问题的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

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

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

  • 相关阅读:
    SQL存储过程基础(从基础开始学,加油!)
    SQL语句经典大全
    SQL SQL语句的增删改查
    web app iphone4 iphone5 iphone6 响应式布局 适配代码
    DOM和 jquery 基础
    HTML 和CSS 语言
    python的目标
    老男孩学习DAY11-1 进程、进程池、协程
    老男孩python DAY10 soket 编程
    老男孩全栈PYTHON -DAY8-面向妹子(对象)编程
  • 原文地址:https://www.cnblogs.com/hanyulcf/p/1604244.html
Copyright © 2011-2022 走看看