zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ExecuteNonQuery()返回值
    GridView导入至EXCEL (报错处理:只能在执行 Render() 的过程中调用 RegisterForEventValidation)
    mysql 远程登录
    四舍六入 银行家算法
    linux-grep-tail-find
    spring 事务注解
    aop execution 表达式解析
    事务有效条件
    oracle 日期取 月 日
    spring cloud 定时任务
  • 原文地址:https://www.cnblogs.com/nayitian/p/2866723.html
Copyright © 2011-2022 走看看