【问题标题】:Can I generate authentic random number with python?我可以用python生成真实的随机数吗?
【发布时间】:2014-04-06 08:20:46
【问题描述】:

我正在学习 python 的随机模块。而且我知道它会生成伪随机数。它的核心思想是使用一个高频时钟作为种子,然后使用一个函数来产生一个“看起来像随机数”。

据我所知,在现实世界中甚至不可能产生真实的随机数。

但我知道 Unix 随机数产生器引入了一些其他因素,例如鼠标移动轨迹的参数,IO 响应时间,给它的随机数产生器函数引入了不确定性。通过它我们可以获得比普通伪随机数更好的随机数。更难预测。

那么,有没有办法在 python 中产生这样一个随机数,或者导入一个好的第三方库?

【问题讨论】:

  • 使用 random.SystemRandom
  • @U2EF1,如何使用该函数生成数字?我在文档上没有看到太多关于该功能的描述。
  • 可以在random 上调用的所有函数都可以在random.SystemRandom 的实例上调用。例如,rng = random.SystemRandom(); x = rng.randint(1, 10)
  • 还有一个问题,如果random.SystemRandom()可以生成更好的随机数,为什么python不直接使用它作为默认生成器呢?因为它更慢?
  • 速度要慢得多,是的。

标签: python random


【解决方案1】:

random 模块的documentation 有这样的说法:

警告:此模块的伪随机生成器不应用于安全目的。如果您需要加密安全的伪随机数生成器,请使用 os.urandom()SystemRandom

【讨论】:

  • 那么os.urandom()使用操作系统的随机数生成器?如果有些人使用 Windows 怎么办?
  • @Zen 您应该使用random.SystemRandom 来获得与平台无关的简单界面。话虽如此,根据文档,os.urandom() 将在 Windows 上使用CryptGenRandom()。我不知道那是什么,但假设它类似于 /dev/random 比你可能得到的一样好。
  • MS 文档说:“CryptGenRandom 函数用加密随机字节填充缓冲区。”见msdn.microsoft.com/en-us/library/windows/desktop/…
【解决方案2】:

真正的随机数可以生成

https://pypi.python.org/pypi/quantumrandom/

pip install quantumrandom

目前您仅限于 1024 个块,但通过一些简单的编程和一点时间,您将能够将此限制扩展到足够大的样本,以供大多数应用程序使用。

【讨论】:

    【解决方案3】:

    https://www.random.org/integers/
    https://api.random.org/json-rpc/1/

    本网站通过大气白噪声生成随机数,比伪随机数更好用于开发,您也可以使用那里的 API 自动随机数(虽然它不会免费,因为它目前处于测试阶段.)

    另一种获取真随机数的方法是通过量子随机数生成器http://photonics.anu.edu.au/qoptics/Research/qrng.php

    重申之前有人说过的话,出于安全目的,您应该避免使用计算生成的伪随机数。

    【讨论】:

      【解决方案4】:

      Python 没有任何东西可以让您生成“真正随机”或“真实随机”数字,因为它们是均匀分布并且独立于其他一切(尤其是后者)。

      无论如何,“伪随机”和“真正随机”数字之间的区别并不是应用程序关心的。相反,对随机性的要求取决于应用程序,您并没有真正指定您所考虑的应用程序类型。例如,一般来说:

      • 安全应用程序关心数字是否难以猜测;在这种情况下,只有加密的 RNG 才能实现这一要求(即使是依赖于伪随机数生成器的)。一个 Python 示例是 secrets 模块或 random.SystemRandom
      • 科学模拟关心数字是否表现得像独立的均匀随机数,并且经常关心这些数字在以后是否可重现。 Python 示例是 numpy.random.Generatorrandom.Random

      另请参阅以下问题:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-15
        • 2016-03-08
        • 1970-01-01
        • 1970-01-01
        • 2013-11-09
        • 2013-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多