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

原文地址:https://www.cnblogs.com/nayitian/p/2866723.html