为什么 Random.nextLong 不能在 Java 中生成所有可能的 long 值?

2024-01-24

Random 类的 nextLong() 方法的 Javadoc 指出

由于 Random 类仅使用 48 位的种子,因此该算法不会返回所有可能的长值。 (随机javadoc http://docs.oracle.com/javase/7/docs/api/java/util/Random.html#nextLong())

其实现是:

return ((long)next(32) << 32) + next(32);

我的看法如下:为了创建任何可能的 long,我们应该以相同的可能性生成任何可能的 64 位位模式。假设调用next(int)给我们 32 个随机位,那么这些位的串联将是 64 个随机位的序列,因此我们以相同的可能性生成每个 64 位模式。因此所有可能的长值。

我认为编写 javadoc 的人更了解,并且我的推理在某种程度上是有缺陷的。谁能解释我的推理哪里不正确,然后会返回什么样的多头?


由于随机是伪随机的,我们知道给定相同的种子,它将返回相同的值。根据文档的说法,种子有 48 位。这意味着最多可以打印 2^48 个唯一值。如果有更多,则意味着我们之前在位置

如果我们尝试将两个结果连接起来,我们会看到什么?

|a|b|c|d|e|f|...|(2^48)-1|

以上是一些值。有多少对? a-b、b-c、c-d、... (2^48)-1-a。还有2^48对。我们不能只用 2^48 对来填充 2^64 的所有值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Random.nextLong 不能在 Java 中生成所有可能的 long 值? 的相关文章

随机推荐