小智 10
生成随机数的方法有很多种,但有一个共同点——它们都需要外部输入。假设您使用像游戏一样的简单 RNG。RNG 接受输入(通常是系统时间,以秒或毫秒为单位),并执行各种奇怪的数学运算以产生看似随机的输出。
然而,假设您的计算机具有可以测量大气噪声的硬件 - 您可以使用任何笔记本电脑上的内置麦克风或台式机上的外部麦克风轻松地做到这一点......或者您可以测量大气噪声的随机性用户的输入 - 众所周知,人类是熵的良好来源......或者您可以测量亚原子粒子的衰变 - 量子力学是随机的。
如果你可以做任何这些事情 - 并且你实际上可以做所有这些事情(#3 需要特殊硬件),你可以通过加密哈希(例如 SHA-256)传递它们,以相等的概率创建真正随机的字节流对于每一个可能的状态。如果您使用 SHA-256,如果您希望获得最大的随机性,则最好对至少 512 位(64 字节)的数据进行哈希处理。
此外,大多数现代系统的 CPU 中都内置有 TRNG(真随机数生成器);硬件制造商开始这样做是为了满足密码学中对更好的 RNG 的需求。因此,如果 TRNG 可用(使用 pythonsecrets模块),许多系统将默认使用 TRNG。
您可以通过运行轻松检查 Linux 上是否有 TRNG cat /dev/random。如果它在几秒钟后停止并等待,则您不会并且需要使用另一种技术。如果继续与 一样/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
Run Code Online (Sandbox Code Playgroud)
您还可以secrets直接创建十六进制字符串,或生成随机字节流。您可以查看其文档以了解更多信息。