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

mis*_*ico 10 java random

Random类的nextLong()方法的Javadoc表明了这一点

因为Random类使用只有48位的种子,所以此算法不会返回所有可能的长值.(随机javadoc)

实施是:

return ((long)next(32) << 32) + next(32);
Run Code Online (Sandbox Code Playgroud)

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

我认为编写javadoc的人知道的更好,而且我的推理在某种程度上是有缺陷的.任何人都可以解释我的推理在哪里是不正确的,那么将返回什么样的多头?

Pau*_*bel 4

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

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

|a|b|c|d|e|f|...|(2^48)-1|
Run Code Online (Sandbox Code Playgroud)

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