Java中的随机方法似乎不是随机的

Random gen method in java doesn't seem random

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
True random generation in Java
Java random always returns the same number when I set the seed?

我在一个程序中运行这段代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
public String[] gen_phase_zero() {
        Random generator = new Random();
        int r = generator.nextInt(2);
        if (r == 1) {
            String big ="A";
            String small ="a";
            return new String[] { big, small };
        } else {
            String big ="B";
            String small ="b";
            return new String[] { big, small };
        }
    }

如果我运行这几次,我的输出是这样的。

AAAAAAAABBAAAAAABB

不总是这样。但它几乎从未接近50/50

更新:

我不期望50分,但是如果先选择"aa",那么它将是下一个大约3次,但是如果先选择bb,它也将是下一个3次。


嗯,对我来说并不算太糟。让我们创建一个更具统计意义的测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.Random;

public class Test {
    public static void main(String[] args) throws Exception {

        Random rng = new Random();
        int total = 0;
        for (int i = 0; i < 1000000; i++) {
            total += rng.nextInt(2);
        }
        System.out.println("Total:" + total);
    }
}

5次运行的样本输出:

1
2
3
4
5
Total: 501184
Total: 499740
Total: 500116
Total: 500374
Total: 500413

在我看来没有很大的偏见…

我在循环内部调用new Random()时得到了相同的结果,而不是仅仅调用一次——尽管这样做不是一个好主意。


这样做10000次,它将接近50:50。

然后掷9次硬币-结果可能与random.nextint()给你的结果相似。

这里的关键是统计大量的数据。

另外,使用random.nextBoolean()


您需要向随机类添加种子。通常是时间戳。所以尝试一下

1
Random generator = new Random(System.currentTimeMillis);