我可以用Python生成真实随机数吗?

17 投票
5 回答
48248 浏览
提问于 2025-04-18 01:33

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

我了解到,在现实世界中,产生真正的随机数几乎是不可能的。

不过,我知道Unix的随机数生成器引入了一些其他因素,比如鼠标移动轨迹的参数和输入输出的响应时间,以增加随机数生成函数的不确定性。通过这种方式,我们可以得到比普通伪随机数更好的随机数,这种随机数更难以预测。

那么,在Python中有没有办法生成这样的随机数,或者说有没有好的第三方库可以使用呢?

5 个回答

1

我觉得这个方法可以用:

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
1

Python没有办法生成“真正随机”或“真实随机”的数字,意思是这些数字不能保证是均匀分布的,也不能保证与其他一切无关(尤其是后者)。

不过,“伪随机”和“真正随机”数字之间的区别其实对应用来说并不重要。随机性的要求取决于具体的应用,而你并没有说明你想要什么样的应用。比如,一般来说:

  • 安全应用会关注数字是否难以猜测;在这种情况下,只有加密随机数生成器(RNG)才能满足这个要求(即使它依赖于伪随机数生成器)。在Python中,可以使用secrets模块或random.SystemRandom
  • 科学模拟则关注数字是否表现得像独立的均匀随机数字,并且通常还希望这些数字在以后能重复得到。Python中的例子有numpy.random.Generatorrandom.Random

你也可以看看这些问题:

2

这个网站可以通过大气中的白噪音生成随机数字,这种方法比计算机生成的伪随机数字更可靠,适合开发使用。你还可以使用他们的API来自动生成随机数字(不过现在是测试阶段,可能不久后就要收费了)。

获取真正随机数字的另一种方法是使用量子随机数生成器,具体可以查看这个链接:http://photonics.anu.edu.au/qoptics/Research/qrng.php

再强调一下,之前有人提到过,出于安全考虑,最好不要使用计算机生成的伪随机数字。

14

真正的随机数可以通过以下链接生成:

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

pip install quantumrandom

目前,你生成的随机数块限制在1024个,但只要稍微编程一下,花点时间,你就能把这个限制扩展到足够大的数量,适合大多数应用。

13

random模块的说明文档中提到:

警告:这个模块里的伪随机生成器不适合用来做安全相关的事情。如果你需要一个安全的伪随机数生成器,应该使用 os.urandom() 或者 SystemRandom

撰写回答