美文网首页
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實現測試三門問題的結果

    前段時間發現了三門問題,具體實現了一下。 下面是經過簡化的代碼,沒有進行封裝,將整個三門問題作爲對象,減少調用次數

  • 脈輪測驗

    脈輪測驗 試試免費的脈輪(Chakra)測驗,看看你目前七個脈輪能量中心的活躍情況: 本測驗共56個問題,每個問題...

  • 框架

    (1) 我們要善於從問題框架的關注圈 移動到 結果框架的關注圈。 以下詳細闡述什麼是問題和結果框架。 問題框架 1...

  • 從測試代碼回推生產代碼壞味道

    前言 寫單元測試常碰到的兩種問題: dependency 的問題,導致無法隔離相依,無法模擬或驗證相依對象的互動 ...

  • 關於養小鬼的一些感觸

    其實一直想專門來探討一下『豢養靈體』這個現象。其實,當人會走到豢養靈體這一步,在心態上就已經出現問題了。 為什麼?...

  • 教育测量理论

    古典測驗理論和試題反應理論之特性 在古典測驗理論中,假定個人在測驗上的實得分數是由兩部分所組成:一部分是真實分數,...

  • 情緒管理是一門大功課

    情緒管理,確實是一門大學問,特別是與我而言。 我今天下午因為找房子換房子租住的問題,又陷入了情緒的小坑。 我到現在...

  • 英語學習 | 用世界名刊測測你的英語水平

    昨晚,小編無意中發現了篇很有趣的英文測試文章,想給大家來分享下,就是關於大刊英語的一個小測驗,用十道題測測你的英文...

  • 遇到難題時不妨試試這個方法

    [遇到難題時不妨試試這個方法] 如果你遇到不知道如何解決的問題,那不妨試試看去看看跟你遇到一樣問題的人怎麼解決,這...

  • 不要再問:要不要換工作?

    每天都有人來問我,要不要換工作?或是要不要離開現職,跳到另一個工作? 其實,這個問題「很有問題」。 我沒辦法回答你...

网友评论

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

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