Java随机类输出1或0
结果令人印象深刻。然而,每个人都有将近50%的人,我担心的是这个过程。有时我一卷得到10个1或者一卷得到8个0。我认为在那个时期不是真正的随机性。我想避免这种情况,只允许最多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);
}
# 1 楼答案
在我回答之前请注意,如果我能预测下一个数字,它实际上不是随机的。在你的例子中,如果我连续得到三个0,我100%肯定地知道下一个数字将是1
现在,实现您所要求的最简单的方法就是引入两个新变量:一个在结果更改时重置的计数器,以及一个最后返回值的缓存。如果计数器在一行中达到结果允许的最大值(一行中有三个0),则只需返回另一个数字并重置计数器(并将此返回值存储在lastReturned缓存中)
这将使您的分布接近50%,因为它在1和0中的分布应该大致相同。它应该很容易测试出来验证
# 2 楼答案
真正的随机性可能会连续出现1万次。这不太可能,但它可以。因此,我强烈建议重新调整你的期望
如果你真的想要有偏见的随机性,一个逐渐减少的“公平”投币,你需要通过跟踪最近的结果和调整你的概率来实现这一点