当我运行下面的代码时,无论我为 for
循环使用什么范围,代码总是打印十次 true
。
public static void main(String[] args)
{
Random bool = new Random();
for (int i = 0; i < 10; i++) {
bool.setSeed(i);
System.out.println(bool.nextBoolean());
}
}
但是,如果我对代码稍作更改并让随机生成器在打印前运行一次 nextBoolean()
函数,我将得到 true
的正态分布当我更改 for 循环的范围时,输出中的 false
会发生变化:
public static void main(String[] args)
{
Random bool = new Random();
for (int i = 0; i < 10; i++) {
bool.setSeed(i);
bool.nextBoolean(); //Only change
System.out.println(bool.nextBoolean());
}
}
在我看来,nextBoolean()
函数在第一次执行时总是返回 true
,这种行为有什么原因吗?
最佳答案
原因在setSeed
方法的API中找到:
The implementation of setSeed by class Random happens to use only 48 bits of the given seed.
事实上,您作为种子值提供的 long
乘以一个固定值(在 Random
类中私有(private)定义),然后只有最低有效的 48 位是经过考虑的。尽管这个乘数很大,但因为您的 i
值序列都是连续的,所以它们都会产生数值相似的种子值。因此,前几千个值实际上被视为与 nextBoolean
方法具有相同的值,并且您获得完全相同的 initial boolean 值。再次调用 nextBoolean
(无需再次调用 setSeed
)将重新乘以种子值,因此您很快就不会看到相同的模式。
如果您确实调用了 setSeed
方法,您应该只需要调用一次,并且应该在循环之外进行。但是 Random
类完全能够选择自己的种子值,所以我建议您根本不要调用 setSeed
除非您知道为什么要这样做。
关于java - 无论种子如何,Random.nextBoolean() 总是返回 True,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29475777/