Java Random Class输出1或0

时间:2014-02-13 05:17:51

标签: java random

结果令人印象深刻。每个人差不多50%,但这个过程是我担心的。有时我会卷成10个或卷成8个零。我在那个时期考虑的并不是真正的随机性。我想避免这种情况,只允许大多数3次重复序列。对此有一个很好的建议吗?

    int resetOne = 0;
    int resetZero = 0;
    Random ran = new Random();
    while (y < 100) {
        y++;
        x = ran.nextInt(2);
        if (x == 1) {
            resetOne++;
            resetZero = 0;
            if (resetOne == 3) {
                x = ran.nextInt(2);
            }
            oneCounter++;

        } else if (x == 0) {
            resetZero++;
            resetOne = 0;
            if (resetZero == 3) {
                x = ran.nextInt(2);
            }
            zeroCounter++;
        }

        System.out.println(x);
        System.out.println("0 = " + zeroCounter + " " + "1 = " + oneCounter);
    }

2 个答案:

答案 0 :(得分:2)

真正的随机性可以连续出现1万次。它不会可能,但它可以。所以我强烈建议重新调整你的期望。

如果你真的想要有偏见的随机性 - 逐渐减少“公平”的硬币翻转 - 你需要通过跟踪最近的结果并调整你的概率来自己实现。

答案 1 :(得分:1)

作为我回答之前的一个注释,如果我可以预测下一个数字是什么,它实际上并不是随机的。在你的情况下,如果我连续三个0,我100%确定下一个数字将是1。

现在,实现所要求的最简单方法就是引入两个新变量:一个在结果发生变化时重置的计数器,以及一个最后返回值的缓存。如果计数器在某行中允许的最大值(连续三个0),则只返回另一个数字并重置计数器(并将此返回值存储在lastReturned缓存中)。

这应使您的分布接近50%标记,因为它应该大约相等地发生1和0。它应该很容易测试出来进行验证。