【问题标题】:How exactly does PC/Mac generates random numbers for either 0 or 1?PC/Mac 究竟如何为 0 或 1 生成随机数?
【发布时间】:2013-01-27 07:12:14
【问题描述】:

这个问题不是关于如何使用任何语言来生成任意区间之间的随机数。它是关于生成 0 或 1。

我了解许多随机生成器算法操纵非常基本的随机(0 或 1)函数,并从用户那里获取种子,并根据需要使用算法生成各种随机数。

问题是 CPU 是如何生成 0 或 1 的?如果我扔硬币,我可以产生正面或反面。那是因为我亲自投掷硬币,让大自然来决定。但是 CPU 是如何做到的呢? CPU 必须执行一个动作(例如扔硬币)才能随机获得 0 或 1,对吧?

谁能告诉我?

谢谢

【问题讨论】:

    标签: random cpu


    【解决方案1】:

    (这有几个方面,因此有几种算法。请记住,有许多不同形式的随机性用于不同的目的,但我理解你的问题是因为你对用于密码学的实际随机性感兴趣.)

    这里的根本问题是计算机(大部分)是确定性机器。给定相同状态下的相同输入,它们总是产生相同的结果。但是,有几种方法可以实际收集熵:

    1. 用户输入。由于用户将外部输入带入系统,因此您可以从中获取一些信息。类似于使用放射性衰变或线路噪声的方式。
    2. 网络活动。同样,外部资源。
    3. 通常是中断(包括前两个)。
    4. 如第一项所述,可以使用来自外围设备(例如音频输入或网络摄像头)的噪声。
    5. 有专门的硬件可以每秒产生几百 MiB 的随机性。不过,通常它们会直接给你随机数,而不是它们的内部熵。

    如何准确地从中得出位取决于您,但您可以使用事件之间的时间,或事件中的实际内容等 - 通常消除熵源的偏差并不容易或微不足道,需要大量的思考和算法工作进入其中(在上述特殊硬件的情况下,这一切都是在硬件中完成的,使用它的代码不需要关心它)。

    一旦你有一个真正的随机位池,你就可以将它们用作随机数(Linux 上的/dev/random 就是这样做的)。但这也有不利之处,因为实际熵通常很少,而且对随机数的需求可能更高。因此,您可以发明算法来“拉伸”初始随机性,使其仍然不可能或至少非常难以预测有关后续数字的任何事情(Linux 上的 /dev/urandom 或 FreeBSD 上的 /dev/random/dev/urandom 都可以做到这一点)。 FortunaYarrow 是所谓的加密安全伪随机数生成器,在设计时就考虑到了这一点。您仍然可以很好地保证生成的随机数的质量,但在熵池用完之前还有更多。

    在任何情况下,CPU 本身都无法给您随机的 0 或 1。涉及的内容更多,通常包括完整的计算机系统或为此目的而构建的特殊硬件。


    还有第二类计算随机性:普通伪随机数生成器 (PRNG)。我之前所说的决定论——这就是它的体现。给定相同的所谓 seed,PRNG 每次都会产生完全相同的数字序列¹。虽然这听起来很愚蠢,但它有实际的好处。

    假设您运行一个涉及大量随机数的模拟,可能是为了模拟涉及某些概率和不可预测行为的分子或原子之间的相互作用。在科学中,你想要任何人都可以独立验证的结果,只要给定相同的设置和程序(或者,通过计算,相同的算法)。如果您使用实际随机性,则唯一的选择是保存每个随机数,以确保其他人可以独立复制结果。

    但是使用 PRNG,您只需要保存种子并记住您使用的算法。然后其他人可以独立获得完全相同的伪随机数序列。非常好的财产:-)


    脚注

    ¹ 这甚至包括上面提到的 CSPRNG,但它们被设计为以一种特殊的方式使用,包括定期用熵重新播种来克服这个问题。

    【讨论】:

    • 感谢您的回答。所以你的意思是实际上 CPU 本身并没有或不能真正生成自然随机的 0 或 1。相反,无论如何,CPU 需要一些外部因素来帮助随机生成 0 或 1?
    • 确实如此。我想我现在只是在我的编辑中添加了那句话。
    【解决方案2】:

    CPU 只能生成一个统一的随机数 U(0,1),其范围恰好在 0 到 1 之间。因此从数学上讲,它可以定义为 [0,1] 范围内的随机变量 U。在 0 到 1 范围内随机抽取 U(0,1) 随机数的示例是 0.28100002、0.34522、0.7921 等。0 到 1 之间的任何值的概率相等,即它们是等概率的。

    您可以通过将 U(0,1) 的随机抽取设置为 0 如果 U(0,1) 来生成 0 或 1 的二进制随机变量0.5,因为理论上会有相同数量的 U(0,1) 随机抽取低于 0.5 和高于 0.5。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 2014-03-02
      相关资源
      最近更新 更多