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

标签 java loops random boolean

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

相关文章:

python - 循环一个函数直到它达到阈值然后完成脚本

java - 使用 `import java.util.Random` 如何获得不重复的结果?

java - 为什么我在尝试 DFS 这张图时得到 StackOverFlowError?

java - 形状、Drawable“形状名称”、形状继承和接口(interface)

ruby-on-rails - 如何获取数组中的下一个和上一个元素,Ruby

python while循环意外行为

c# - 自定义随机数生成器

android - 使用随机 Q 和多个 A 创建 Android 测验

java - Java 中区分 CD 驱动器和硬盘驱动器

java - 错误消息未传递 - 失败消息为空?