0

我正在尝试使用下面的代码模拟硬币翻转。

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?

4

6 回答 6

9

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

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

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

于 2012-09-21T15:36:56.843 回答
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);

}
于 2012-09-21T15:39:19.507 回答
3

一旦你解决了你的编译问题,你会发现你的“硬币”是不公平的:它给你的“尾巴”比“正面”要多得多。事实上,你很少会得到任何“正面”!

这是因为random()给你一个doublebetween 0and 1,而不是一个intof 0and 1。因此,您需要按如下方式更改您的条件:

if (result < 0.5) {
    count[0]++;
    return false;
} else {
    count[1]++;
    return true;
}
于 2012-09-21T15:39:36.037 回答
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;
    //}
}
于 2012-09-21T15:45:42.760 回答
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;
}
于 2012-09-21T15:36:58.607 回答
1

Math.random()java.lang.Math类中的一个方法

于 2012-09-21T15:37:14.880 回答