前段時間發現了三門問題,具體實現了一下。
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;
}
}
}
网友评论