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

时间:2010-02-06 17:07:24

标签: math random java lcg

为什么这个类在其线性同余公式中使用48位种子? 我本来期望32或64 ......

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

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

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

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

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

答案 2 :(得分:1)

Linear Congruential Generator (LCG)的特点是三个参数 a c m 。只有certain combinations给出了最长的时间段,而且并非所有时间都得到了很好的研究。选择可能受到复杂性和预期用途之间通常的权衡的影响。幸运的是,该类设计合理,可以继承,因此other implementations是可能的。