2012-09-21 47 views
0

我試圖用下面的代碼來模擬硬幣翻轉。math.Random不能正常工作

public class Coin 
{ 
    public static double result; 
     int[] count = new count[2]; 

    public static void flip() 
    {  
     result = Math.random(); 
    } 

     public static boolean isHeads() 
     { 
     if (result == 0.0) 
     { 
        count[0]++; 
      return false; 
     } 

     else 
     { 
        count[1]++; 
      return true; 
     } 
     } 

     public static void main(String[] args) 
     { 
      flip(); 
      isHeads(); 
      System.out.println(count[0]); 
      System.out.println(count[1]); 
     } 
} 

出於某種原因,Eclipse中說,

導入了java.util.Random;

從來沒有使用,即使我明確使用它。我沒有把我的for循環放到上面的代碼中,但它循環n次,然後輸出結果。無論它循環多少次,它總是返回結果大於0.0,這是不正確的。我是不是正確地調用Math.random?

+12

數學。Random和java.util.Random不是一回事! – gtgaxiola

+1

他們是不同的東西,Eclipse是正確的。 – Arran

+3

'result == 0.0'比我想象的要少得多。 – Flexo

回答

5

我會建議更換使用

java.util.Random

public static void main(String[] args) throws Exception { 
    Random rand = new Random(); 

    int headCount = 0; 
    int tailCount = 0; 

    for (int i = 0; i < 10; i++) { 
     int value = rand.nextInt(2); 

     if (value == 0) { 
      System.out.println("Heads"); 
      headCount++; 
     } else { 
      System.out.println("Tails"); 
      tailCount++; 
     } 
    } 

    System.out.println("Head Count: " + headCount); 
    System.out.println("Tail Count: " + tailCount); 

} 
+1

如何計數[值] ++ –

+3

如果你有'價值= rand.nextInt(2);',你知道'價值'是0或1。測試'值%2 == 0'然後不必要的複雜,'值== 0'更清晰。 –

+0

@Daniel Fischer謝謝! – gtgaxiola

9

您正在使用數學,它可能使用隨機數,但您沒有在任何地方使用隨機數。

無論它循環多少次,它總是返回結果大於0.0,這不可能是正確的。我是不是正確地調用Math.random?

有0.0和1.0之間和作爲隨機2^53可能值僅使用48位種子,有可能你可以生成每double它將創建和沒有人曾經值發生。如果你使用SecureRandom,你有2^53的機會返回0.0。

1

您應該創建一個util.Random的實例並使用它來生成您的號碼。

您可以通過

static Random r = new Math.Random(); 
public static void flip() {  
    result = r.nextDouble(); 
} 

正如你所需要的其實是一個布爾更換

public static void flip() 
{  
    result = Math.random(); 
} 

,我建議你使用nextBoolean方法:

static Random r = new Math.Random(); 
static boolean result; 
public static void flip() {  
    result = r.nextBoolean(); 
} 
public static boolean isHeads() { 
    count[result?1:0]++; 
    return result; 
} 
+1

「創建'Math.Random'的一個實例」 - 你的意思是'util.Random'? – Flexo

+1

它不是Math.Random,dystroy;) – Fildor

+0

@Flexo你是對的......我的鏈接至少有好處;) –

1

Math.random()java.lang.Math類中的方法

+0

也許是「隨機」,而不是「隨機」? –

+0

是的,謝謝指出..其錯誤 – PermGenError

3

一旦你解決你的編譯的問題,你會發現你的「硬幣」是不公平的:它給你的「尾巴」了很多更經常比「頭」。事實上,你很少會得到任何「首腦」!

這是因爲random()給你01之間的double,不是01int。因此,你需要改變你的條件如下:

if (result < 0.5) { 
    count[0]++; 
    return false; 
} else { 
    count[1]++; 
    return true; 
} 
+1

這比最初的答案更有幫助。 – Flexo

2

的Math.random和java.util.Random的是兩個不同的東西。

static Random random = new Math.Random(); 
public static void flip() {  
    result = random.nextDouble(); 
} 

public static boolean isHeads() { 
    if (result > 0.5) { 
     count[0]++; 
     return false; 
    } 
    //else { 
     count[1]++; 
     return true; 
    //} 
}