为什么在util类中有48位种子?

为什么这个类在其线性同余公式中使用48位种子? 我原以为32或64 ……

我知道当要求32位值时,它需要更高阶的位。 但为什么只有16个额外的位? 这是一个“随机”的选择吗?

您需要更多的状态位而不是输出位,因为LCG的性质使得状态的低位不是非常随机的。 因此,如果您需要32位输出,则需要超过32位的状态。

为什么使用48而不是64? 因为48就足够了,并且你在几十年前设计了这个,所以有充分的理由想要避免使用比严格必要的资源更多的资源。

它背后的数学来自数论和伪随机数发生器的数学定义。 它肯定不是“随机”(解释为任意)选择。

计算机上的随机数生成器实际上试图成为真正的伪随机数生成器。

您可以将伪随机数生成器视为扩展函数,它接受输入seed ,然后输出数字流G(seed)

理想情况下,您希望您的伪随机数生成器与真正的随机数生成器无法区分,但您还必须意识到您的伪随机数生成器必须被有效地采样(多项式时间)和确定性(意味着它将完全相同的流放在同一个流中)输入种子)。

因此,只有32位种子空间意味着希望确定您的流是否真正随机(或根据随机数生成器中断您的加密算法)的对手只需要通过32位密钥空间(种子空间)并对其进行采样生成器的输出与您提供的“随机”流进行比较,看看它是否匹配。 再添加16位会在密钥(种子)空间中增加更多的范围,从而使枚举所有可能的密钥(种子)变得更加困难。

至于为什么不去寻找完整的64位…可能在实现算法时,硬件处理能力不像今天在现代基于x64的处理器上那样有效地支持64位操作,所以它们在48处停止。

线性同余发生器(LCG)的特征在于三个参数acm 。 只有某些组合给出了最大的时间段,并不是所有组合都得到了同样好的研究。 选择可能受到复杂性和预期用途之间通常的权衡的影响。 幸运的是,该类设计合理,可用于inheritance,因此其他实现也是可行的。