让程序来猜猜那个传说中经典的概率题

来源:互联网 发布:成都行知小学地址 编辑:程序博客网 时间:2024/05/21 06:11
题目如下;:

假设你在进行一个游戏节目。现给三扇门供你选择:一扇门后面是一辆轿车,另两
扇门后面分别都是一头山羊。你的目的当然是要想得到比较值钱的轿车,但你却并
不能看到门后面的真实情况。主持人先让你作第一次选择。在你选择了一扇门后,
知道其余两扇门后面是什么的主持人,打开了另一扇门给你看,而且,当然,那里
有一头山羊。现在主持人告诉你,你还有一次选择的机会。那么,请你考虑一下,
你是坚持第一次的选择不变,还是改变第一次的选择,更有可能得到轿车?

《广场杂志》刊登出这个题目后,竟引起全美大学生的举国辩论,许多大学的教授
们也参与了进来。真可谓盛况空前。据《纽约时报》报道,这个问题也在中央情报
局的办公室内和波斯湾飞机驾驶员的营房里引起了争论,它还被麻省理工学院的数
学家们和新墨哥州洛斯阿拉莫斯实验室的计算机程序员们进行过分析。

现在,请你来回答一下这个问题。

用java写的程序.

import java.util.*;
public class  Check

{
  public static void main(String []args)
  {
      //0车 1羊1 2羊2
      ArrayList arrayListc=new ArrayList(1000000);
    ArrayList arrayListn=new ArrayList(1000000);
  Check check=new Check();
      for(int i=0;i<1000000; i++)
      {
      int iFirst=check.getFirstCheck();
      int iComp=check.getCompCheck(iFirst);
      int ic=    check.getChangedCheck(iFirst,iComp);
      if(ic==0) arrayListc.add(new Integer(ic));
      int in=check.getNoChangeCheck(iFirst);
      if(in==0) arrayListn.add(new Integer(in));
      }
      System.out.println("no change"+arrayListn.size());
    System.out.println("change   "+arrayListc.size());
  }
  //获得0-i之间的数
  public int getNumber(int i)
  {
      return new Random().nextInt(i);
  }
  //第一次选择
  public int getFirstCheck()
  {
      int i=getNumber(3);
     return i;
  }
  //主持人选择
  public int getCompCheck(int i)
  {
      if(i==0)
      return getNumber(2)+1;
      else if(i==1)
      return 2;
      else
      return 1;
  }
  //如果换第一次选择
  public int getChangedCheck(int iFirst,int iComp)
  {
      return 3-iFirst-iComp;
  }
  //不换第一次的选择
  public int getNoChangeCheck(int iFirst)
  {
    return iFirst;   
  }
}


程序执行5次的结果如下
no change333587
change   666413

no change332892
change   667108

no change333028
change   666972

no change331889
change   668111

no change333206
change   666794

嘿嘿所以说换还是比较明智的...