2014-03-31 25 views
0

前(注:有一些類似的問題,但我無法找到一個確切的重複)模擬拋硬幣來獲得2頭3尾(JAVA)

問題

考慮擲硬幣的任意次數。在3尾之前獲得2頭的概率是多少?

代碼

爲了模擬這一點,我設置了千萬試驗,其中0的是頭,1名的是尾巴等

ArrayList<Integer> listOfTosses=new ArrayList<Integer>(); 
    int numTrue=0; 
    int numTrials=0; 

    while(numTrials<10000000) 
    { 
     boolean record=false; 
     boolean twoHeads=false; 
     int counter=2; 

     listOfTosses.add((int) Math.random()*2); 
     listOfTosses.add((int) Math.random()*2); 

     if(listOfTosses.get(0)==0 && listOfTosses.get(1)==0) 
     { 
      twoHeads=true; 
      record=true; 
     } 

     listOfTosses.add((int) Math.random()*2); 

     while(record=false) 
     { 

      if(listOfTosses.get(counter)==0 && listOfTosses.get(counter-1)==0) 
      { 
      twoHeads=true; 
      record=true; 
      } 
      if(listOfTosses.get(counter)==1 
      && listOfTosses.get(counter-1)==1 
      && listOfTosses.get(counter-2)==1)     
     { 
      twoHeads=false; 
      record=true; 
     } 
      listOfTosses.add((int) Math.random()*2); 
      counter++; 
     } 




     if(twoHeads==true) 
     { 
      numTrue++; 
     } 


     record=false; 
     twoHeads=false; 
     listOfTosses.clear(); 

     numTrials++; 

    } 
    System.out.print(numTrue/10000000.0); 

問題

的代碼編譯正確,但總是給我一個1.0的答案(可以從數學上證明確切的答案是0.7)。

回答

1

One typo:將while(record=false)更改爲while(record==false)

最重要的是,您的while循環運行,而record == false未運行。這是因爲listOfTosses.get(0)listOfTosses.get(1)都設置爲0.

當您做listOfTosses.add((int) Math.random()*2);時,它實際上等於listOfTosses.add(((int) Math.random()) * 2);。從Math.random() < 1開始,變爲0.請改爲listOfTosses.add((int) (Math.random()*2));

或者,不要處理轉換浮動,請考慮java.util.Random類。 nextInt(int n)函數看起來像你所需要的。