math.Random无法正常工作

时间:2012-09-21 15:34:42

标签: java 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说的是

import java.util.Random;

即使我明显使用它,

也从未使用过。我没有把我的for循环放到上面的代码中但它循环了很多次然后输出结果。无论它循环多少次,它总是返回结果大于0.0,这是不对的。我是否错误地调用Math.random?

6 个答案:

答案 0 :(得分:9)

您正在使用Math,它可能正在使用Random,但您并未在任何地方使用Random。

  

无论它循环多少次,它总是返回结果大于0.0,这是不对的。我是否错误地调用Math.random?

在0.0和1.0之间有2 ^ 53个可能的值,并且由于Random仅使用48位种子,因此您可以生成它将创建的每个double,并且不会发生任何一个值。如果你使用SecureRandom,你有一个2 ^ 53的机会返回0.0。

答案 1 :(得分: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);

}

答案 2 :(得分:3)

一旦你修复了你的编译问题,你会发现你的“硬币”不公平:它比“头”更频繁地给你“尾巴”。事实上,你很少得到任何“头”!

这是因为random()double0之间提供了1,而不是int 01 }。因此,您需要按如下方式更改条件:

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

答案 3 :(得分: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;
    //}
}

答案 4 :(得分:1)

您应该创建util.Random的实例并使用它来生成您的数字。

你可以替换

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

通过

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

而你所需要的实际上是一个布尔值,我建议你使用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;
}

答案 5 :(得分:1)

Math.random()java.lang.Math

中的方法