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

2017-10-24  本文已影响0人  zigzh

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

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;
        }
    }

}
上一篇下一篇

猜你喜欢

热点阅读