【问题标题】:why 48 bit seed in util Random class?为什么 util Random 类中有 48 位种子?
【发布时间】:2011-01-13 21:46:46
【问题描述】:

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

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

【问题讨论】:

标签: math random java lcg


【解决方案1】:

你需要更多的状态位而不是输出位,因为 LCG 的本质是状态的低位根本不是非常随机的。所以如果你想要 32 位的输出,你需要超过 32 位的状态。

为什么使用 48 而不是 64?因为 48 就足够了,而且您是在几十年前设计的,所以有充分的理由希望避免使用超出绝对必要的资源。

【讨论】:

    【解决方案2】:

    其背后的数学来自数论和伪随机数生成器的数学定义。这当然不是一个“随机”(被解释为任意)选择。

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      一个Linear Congruential Generator (LCG)的特征是三个参数acm。只有certain combinations 给出了最长期限,并不是所有的都得到了同样充分的研究。选择可能受到复杂性和预期用途之间通常权衡的影响。幸运的是,该类为继承设计得相当好,所以other implementations 是可能的。

      【讨论】:

        猜你喜欢
        • 2019-02-22
        • 2014-09-14
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 1970-01-01
        • 2011-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多