【问题标题】:Generating true random numbers with python用python生成真正的随机数
【发布时间】:2021-10-10 02:11:23
【问题描述】:

我最近发现真正随机数的生成是计算机科学中一个未解之谜。 有解决这个异常的python函数吗?

【问题讨论】:

标签: python random


【解决方案1】:

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

无论如何,“伪随机”和“真正随机”数字之间的区别并不是应用程序所关心的(而且您并没有真正指定您所考虑的应用程序类型)。相反,一般来说:

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

另请参阅以下问题:

【讨论】:

    【解决方案2】:

    产生随机数的方法有很多种,只有一个共同点——它们都需要外部输入。假设您使用游戏使用的简单 RNG。 RNG 接受一个输入(通常是系统时间,以秒或毫秒为单位),并执行各种不可靠的数学运算以产生看起来随机的输出。

    但是,假设您的计算机具有可以测量大气噪声的硬件 - 您可以使用任何笔记本电脑上的内置麦克风或台式机上的外部麦克风轻松做到这一点...或者您可以测量用户输入的随机性——众所周知,人类是熵的良好来源……或者你可以测量亚原子粒子的衰变——量子力学是随机的。

    如果您可以做任何这些事情 - 而且您实际上可以做到所有(#3 需要特殊硬件),您可以通过加密哈希(例如 SHA-256)将它们传递给为每个可能的状态创建一个具有相同概率的真正随机字节流。如果您使用 SHA-256,如果您想要尽可能多的随机性,最好散列至少 512 位(64 字节)的数据。

    此外,大多数现代系统都在其 CPU 中内置了 TRNG(真随机数生成器);硬件制造商开始这样做是为了解决密码学中对更好 RNG 的需求。因此,如果 TRNG 可用,许多系统将默认使用 TRNG(使用 python secrets 模块)。

    您可以通过运行cat /dev/random 轻松检查您是否在 Linux 上安装了 TRNG。如果它在几秒钟后停止并等待,则您不需要并且需要使用另一种技术。如果继续和/dev/urandom 一样,那么你已经有了一个TRNG,并且可以轻松地生成真正的随机数!

    更新: Python secrets 模块文档可以在 here 找到。 一个简单的示例程序:

    import secrets
    low = 10
    high = 100
    out = secrets.randbelow(high - low) + low # out = random number from range [low, high)
    print(out) # Print your number
    

    您也可以使用secrets 直接创建一个十六进制字符串,或者生成一个随机字节流。您可以查看其docs 以了解更多信息。

    【讨论】:

    • pip installquantumrandom 我在上面发布的线程上找到了这个。目前,您仅限于 1024 块,但通过一些简单的编程和一点时间,您将能够将此限制扩展到足够大的样本,以供大多数应用程序使用。
    • 这很有趣!
    【解决方案3】:

    有一种东西叫做真随机数。
    检查:www.random.org 了解更多信息。
    代码示例:

    import requests
    source = "https://www.random.org/integers/?num=1&min=1&max=100&col=5&base=10&format=plain&rnd=new"
    number = requests.get(source)
    number = int(number.text)
    

    【讨论】:

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