2012-09-21 44 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; 
    //} 
}