Let's Make a Deal(游戏)
源自美国电视娱乐节目Let’s Make a Deal
1. 问题
假设你正在参加一个游戏节目,你被要求在三扇门中选择一扇。其中一扇后面有一辆车,其余两扇后面则是羊。
你选择了一扇门,假设是1号门,然后知道门后面有什么的主持人开启了另一扇后面有羊的门,假设是3号门。
然后他问你:“你想选择2号门吗?”你会如何回答?
解答:应该换,因为换了之后有2/3的概率赢得车,不换的话概率只有1/3。
2. 记住
如果参赛者挑了一扇有羊的门,主持人必须挑另一扇有羊的门。
如果参赛者挑了一扇有车的门,主持人随机在另外两扇门中挑一扇有羊的门。
3. 下面用程序模拟选择
package com.clzhang.game; import java.util.*; /** * 源自美国电视娱乐节目Let’s Make a Deal * * 问题:设你正在参加一个游戏节目,你被要求在三扇门中选择一扇。其中一扇后面有一辆车,其余两扇后面则是羊。 * 你选择了一扇门,假设是1号门,然后知道门后面有什么的主持人开启了另一扇后面有羊的门,假设是3号门。 * 然后他问你:“你想选择2号门吗?”你会如何回答? * * 解答:应该换,因为换了之后有2/3的概率赢得车,不换的话概率只有1/3 * * 记住: * 如果参赛者挑了一扇有羊的门,主持人必须挑另一扇有羊的门。 * 如果参赛者挑了一扇有车的门,主持人随机在另外两扇门中挑一扇有羊的门。 * * 下面用程序模拟选择 * @author acer * */ public class DoChoice { // BOX的模拟器 public class SimulateCarBox { // 车的BOX号码,取值范围0、1、2 private int carInBoxNumber = 0; // 用户选择的BOX号码 private int userChoice = 0; public SimulateCarBox(int defaultCar) { // 初始化时,哪个BOX是车 carInBoxNumber = defaultCar; } // 返回车的BOX号码 public int getCarInBoxNumber() { return carInBoxNumber; } // 用户选择的BOX号码 public void setUserChoice(int userChoice) { this.userChoice = userChoice; } // 用户选择是否与车所在BOX一致 public boolean isRightChoice() { return userChoice == carInBoxNumber; } } public void startTest(int trys) throws Exception { Random randomObject = new Random(System.currentTimeMillis()); // 先生成trys个模拟BOX组 AbstractList<SimulateCarBox> aList = new ArrayList<SimulateCarBox>(); for(int i=0; i<trys; i++) { SimulateCarBox scb = new SimulateCarBox(randomObject.nextInt(3)); aList.add(scb); } for(int i=0; i<aList.size(); i++) { // 生成用户选择,随机 SimulateCarBox scb = aList.get(i); int userChoice = randomObject.nextInt(3); scb.setUserChoice(userChoice); // 主持人选择随机取值,但不能是车所在的BOX,也不能是用户选择的BOX, int compereChoice = -1; do{ compereChoice = randomObject.nextInt(3); }while(compereChoice != scb.getCarInBoxNumber() && compereChoice != userChoice); } // 输出相关的统计数据defaultChoice为默认选择,changeChoice为改变选择 int defaultChoice = 0; int changeChoice = 0; for(int i=0; i<aList.size(); i++) { SimulateCarBox scb = aList.get(i); if(scb.isRightChoice()) { defaultChoice++; }else { changeChoice++; } } System.out.println("不改变选择的机会:" + defaultChoice + "/" + trys); System.out.println("改变选择的机会:" + changeChoice + "/" + trys); } public static void main(String[] args) throws Exception { int trys = 100000; DoChoice doChoice = new DoChoice(); doChoice.startTest(trys); } }
4. 输出结果
不改变选择的机会:33303/100000
改变选择的机会:66697/100000