gpt4 book ai didi

java - 无论种子如何,Random.nextBoolean() 总是返回 True

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:10 25 4
gpt4 key购买 nike

当我运行下面的代码时,无论我为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com