美文网首页
Java實現測試三門問題的結果

Java實現測試三門問題的結果

作者: zigzh | 来源:发表于2017-10-24 00:09 被阅读0次

    前段時間發現了三門問題,具體實現了一下。

    public class test{
        public static void main(String[] args){
            MySet modeOneTest = new MySet(10000,true);
            MyCount countModeOne = new MyCount(modeOneTest);
            MyRandomComputer myRC = new MyRandomComputer();
            MySelector  mysel = new MySelector();
            MyHolder myh = new MyHolder();
    
            run(modeOneTest,countModeOne,myRC,mysel,myh);
    
            MySet modeTwoTest = new MySet(10000,false);
            MyCount countModeTwo = new MyCount(modeOneTest);
            MyRandomComputer myRC2 = new MyRandomComputer();
            MySelector  mysel2 = new MySelector();
            MyHolder myh2 = new MyHolder();
    
            run(modeTwoTest,countModeTwo,myRC2,mysel2,myh2);
    
        }
        public static void run(MySet myset,MyCount mycount,MyRandomComputer myRC,MySelector mysel,MyHolder myh){
            for(int x = 1; x <= myset.getTimer(); x++){
                myRC.setCarNumber();
                mysel.setChoosenFirst();
                int Open = myh.openOneDoor(myRC,mysel);
                int temp = mysel.change(myRC,mysel,myh,myset);
                if(temp == myRC.getCarNumber()){
                    mycount.setSuccessful();
                }
            }
            System.out.println(mycount.getSuccessful());
            mycount.show();
        }
    
    }
    
    class MyRandomComputer{
        private int carNumber;
    
        public void setCarNumber(){
            this.carNumber = (int)(Math.random()*300) % 3;
        }
    
        public int getCarNumber(){
            return carNumber;
        }
    
    }
    class MySelector{
        private int choosenFirst;
    
        public void setChoosenFirst(){
            choosenFirst = (int)(Math.random()*300) % 3 + 1;
        }
    
        public int getChoosenFirst(){
            return choosenFirst;
        }
    
        public int change(MyRandomComputer myRComputer,MySelector mySel,MyHolder myhol,MySet myset){
            return myset.getMode()?(7 - choosenFirst - myhol.openOneDoor(myRComputer,mySel)):choosenFirst - 1;
        }
    
    }
    class MyHolder {
    
        public int openOneDoor(MyRandomComputer myRComputer,MySelector mySel){
            if(myRComputer.getCarNumber()==(mySel.getChoosenFirst()-1)){
                int mode = (int)(Math.random()*100) & 1;
                int max = 0;
                int min = 2;
                //
                for(int x =0; x < 3;x++){
                    max = (x != myRComputer.getCarNumber() && x > max) ? x : max;
                    min = (x != myRComputer.getCarNumber() && x < min) ? x : min;
                }
                return mode == 0 ? max : min;
    
            }else {
                return 7 - mySel.getChoosenFirst() - myRComputer.getCarNumber();
            }
        }
    
    }
    class MyCount{
        private int successful;
        private int testTimer;
    
        public MyCount(MySet myset){
            testTimer = myset.getTimer();
        }
    
        public void setSuccessful(){
            this.successful += 1;
        }
    
        public int getSuccessful(){
            return successful;
        }
    
        public void show(){
            System.out.println((double)successful / testTimer * 100 +"%");
        }
    
    }
    class MySet{
        private int timer;
        private boolean mode;
    
        public MySet(int timer,boolean mode){
            this.timer = timer;
            this.mode = mode;
        }
    
        public int getTimer(){
            return timer;
        }
    
        public boolean getMode(){
            return mode;
        }
    
    }
    

    下面是經過簡化的代碼,沒有進行封裝,將整個三門問題作爲對象,減少調用次數

    public class test2{
        public static void main(String[] args){
            ThreeDoorProblem tdp = new ThreeDoorProblem(10000,true);
            run(tdp);
            tdp.setMode(false);
            run(tdp);
        }
        public static void run(ThreeDoorProblem tdp){
            //運行+統計
            int count = 0;
            for(int x = 1; x <= tdp.timer; x++){
                tdp.setCarNumber();
                tdp.setChoosenFirst();
                int temp = tdp.change();
                if(temp == tdp.carNumber){
                    count++;
                }
            }
            System.out.println((double)count / tdp.timer * 100 +"%");
        }
    }
    
    class ThreeDoorProblem{
        int timer;
        boolean mode;
        int carNumber;
        int choosenFirst;
    
        public ThreeDoorProblem(int timer,boolean mode){
            this.timer = timer;
            this.mode = mode;
        }
        //更改模式
        public void setMode(boolean mode){
            this.mode = mode;
        }
        //生成隨機數,一個對象循環使用
        public void setCarNumber(){
            carNumber = (int)(Math.random()*300) % 3;
        }
        //生成隨機數,一個對象循環使用
        public void setChoosenFirst(){
            choosenFirst = (int)(Math.random()*300) % 3;
        }
    
        public int change(){
            //true:改變;false:返回原值
            int x = openOneDoor();
            return mode?(6 - choosenFirst - x):choosenFirst;
        }
    
        private int openOneDoor(){
            if(carNumber==(choosenFirst)){
                int min = 2;
                //如果選中了正確結果,就隨便開一個羊門
                for(int x =0; x <= 2;x++){
                    min = (x != carNumber && x < min) ? x : min;
                }
                return min;
    
            }else {
                //沒有選中,就衹能選擇另一個有羊的門打開
                return 6 - choosenFirst - carNumber;
            }
        }
    
    }
    

    相关文章

      网友评论

          本文标题:Java實現測試三門問題的結果

          本文链接:https://www.haomeiwen.com/subject/yvizuxtx.html