【问题标题】:Random gen method in java doesn't seem random [duplicate]java中的随机生成方法似乎不是随机的[重复]
【发布时间】:2012-10-31 06:58:01
【问题描述】:

可能重复:
True random generation in Java
Java random always returns the same number when I set the seed?

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

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 };
        }
    }

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

啊 氨基酸 氨基酸 氨基酸 BB 氨基酸 氨基酸 氨基酸 咩

并不总是这样。但它几乎从来没有接近 50/50

更新:

我不期待五十五十,但似乎如果先选择“Aa”,那么接下来会多选 3 次左右,但如果先选择 Bb,则会再选 3 次也是。

【问题讨论】:

标签: java random


【解决方案1】:

嗯,这对我来说看起来还不错。让我们创建一个更具统计意义的测试:

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 次运行的示例输出:

Total: 501184
Total: 499740
Total: 500116
Total: 500374
Total: 500413

看起来非常对我有偏见......

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

【讨论】:

  • total += rng.nextInt(2); 的意义是什么我真的在问最后的“2”。仍然认为自己对 java 很陌生。谢谢。
  • @EGHDK:它与您的原始代码匹配 - 这是一个专有的上限。阅读Random.nextInt 的文档。基本上,该调用将返回 0 或 1。我将结果相加,因此您希望它约为迭代次数的一半。
  • 有趣。好的,谢谢!
【解决方案2】:

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

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

这里的关键是统计上显着的数据量。

顺便说一句,使用random.nextBoolean()

【讨论】:

    【解决方案3】:

    您需要在随机类中添加一个种子。通常它是一个时间戳。所以尝试类似

    Random generator = new Random(System.currentTimeMillis);
    

    【讨论】:

    • 您必须小心,因为您可能会用相同的种子播种所有“随机”生成器。 @EGHDK 的最佳选择实际上是创建尽可能少的 Random 实例。
    • 这无济于事 - 它实际上比默认构造函数更糟糕(它使用时间戳静态计数器。)
    猜你喜欢
    • 1970-01-01
    • 2015-03-27
    • 2018-09-14
    • 2021-04-16
    • 1970-01-01
    • 2011-01-09
    • 2010-11-05
    • 2012-01-23
    相关资源
    最近更新 更多