Python生成真正的随机数

4

Python函数生成真正的随机数?

通过“真正的”随机数,也就是每次运行Python时我生成的种子都不同。我该如何做到这一点?


2
不行。因为真正的随机数不应该依赖于代码或算法。 - Sandrin Joy
“secrets” 模块将是走向“真正随机”的第一步。 您始终需要熵源。 - sascha
https://dev59.com/2mAh5IYBdhLWcg3wDfgW - Prune
1
“任何试图通过确定性手段生成随机数的人,当然是生活在罪恶状态中。” - 冯·诺伊曼 - rossum
3个回答

10

生成随机数的方式有很多种,但它们都有一个共同点 - 都需要外部输入。比如使用类似游戏中使用的简单 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 模块文档可以在此处找到。 一个快速的示例程序:

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直接创建十六进制字符串,或生成随机字节流。您可以查看文档以了解更多信息。

pip install quantumrandom我在上面的帖子中找到了这个。目前,您仅限于1024个块,但通过一些简单的编程和一点时间,您将能够将此限制扩展到足够大的样本以满足大多数应用程序的需求。 - Ali Hassan
这很有趣! - Ali Hassan
Python的绝佳答案,背景知识丰富。太棒了! - Fiddy Bux
我想要的是每次运行Python时生成的种子都不同。我该怎么做? - Charlie Parker
正如所提到的,这是一个非常好的资源:https://dev59.com/2mAh5IYBdhLWcg3wDfgW - Charlie Parker

4

Python中没有可以生成“真正随机”数的工具,就是指这些数字是均匀分布独立于其他所有因素(特别是后者)的意义上。

无论如何,“伪随机数”和“真正随机数”的区别并不是应用程序关心的问题(并且您没有确切说明您所考虑的应用程序类型)。一般来说:

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

请参阅以下问题:


1

有一种东西叫做真随机数。
请查看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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接