我可以用Python生成真实随机数吗?
我正在学习Python的随机模块。我知道它生成的是伪随机数。它的核心思想是用一个高频率的时钟作为种子,然后用一个函数来产生“看起来像随机数”的数字。
我了解到,在现实世界中,产生真正的随机数几乎是不可能的。
不过,我知道Unix的随机数生成器引入了一些其他因素,比如鼠标移动轨迹的参数和输入输出的响应时间,以增加随机数生成函数的不确定性。通过这种方式,我们可以得到比普通伪随机数更好的随机数,这种随机数更难以预测。
那么,在Python中有没有办法生成这样的随机数,或者说有没有好的第三方库可以使用呢?
5 个回答
我觉得这个方法可以用:
def get_truly_random_seed_through_os() -> int:
"""
Usually the best random sample you could get in any programming language is generated through the operating system.
In Python, you can use the os module.
source: https://stackoverflow.com/questions/57416925/best-practices-for-generating-a-random-seeds-to-seed-pytorch/57416967#57416967
"""
RAND_SIZE = 4
random_data = os.urandom(
RAND_SIZE
) # Return a string of size random bytes suitable for cryptographic use.
random_seed: int = int.from_bytes(random_data, byteorder="big")
return int(random_seed)
如果你只想要不同的种子,可以这样做:
def get_different_pseudo_random_seed_every_time_using_time() -> int:
import random
import time
# random.seed(int(time.time()))
seed: int = int(time.time())
return seed
Python没有办法生成“真正随机”或“真实随机”的数字,意思是这些数字不能保证是均匀分布的,也不能保证与其他一切无关(尤其是后者)。
不过,“伪随机”和“真正随机”数字之间的区别其实对应用来说并不重要。随机性的要求取决于具体的应用,而你并没有说明你想要什么样的应用。比如,一般来说:
- 安全应用会关注数字是否难以猜测;在这种情况下,只有加密随机数生成器(RNG)才能满足这个要求(即使它依赖于伪随机数生成器)。在Python中,可以使用
secrets
模块或random.SystemRandom
。 - 科学模拟则关注数字是否表现得像独立的均匀随机数字,并且通常还希望这些数字在以后能重复得到。Python中的例子有
numpy.random.Generator
或random.Random
。
你也可以看看这些问题:
这个网站可以通过大气中的白噪音生成随机数字,这种方法比计算机生成的伪随机数字更可靠,适合开发使用。你还可以使用他们的API来自动生成随机数字(不过现在是测试阶段,可能不久后就要收费了)。
获取真正随机数字的另一种方法是使用量子随机数生成器,具体可以查看这个链接:http://photonics.anu.edu.au/qoptics/Research/qrng.php。
再强调一下,之前有人提到过,出于安全考虑,最好不要使用计算机生成的伪随机数字。
真正的随机数可以通过以下链接生成:
https://pypi.python.org/pypi/quantumrandom/
pip install quantumrandom
目前,你生成的随机数块限制在1024个,但只要稍微编程一下,花点时间,你就能把这个限制扩展到足够大的数量,适合大多数应用。
random模块的说明文档中提到:
警告:这个模块里的伪随机生成器不适合用来做安全相关的事情。如果你需要一个安全的伪随机数生成器,应该使用
os.urandom()
或者SystemRandom
。