Python的random内置模块产生的随机数真的随机吗?

先说结论:不止Python的random内置模块,还包括numpy的随机抽样子模块random,以及其他编程语言的随机数生成器,例如java.Math.Random()函数,所有这些随机数生成器生成的随机数都不是真正的随机数,而是伪随机数。

什么是真随机数呢?真随机数的典型特征是不可预测性。上面所说的这些随机数生成器都是在一个封闭的系统内,使用固定的算法(通常是线性同余或平方取中),通过一个种子(通常用时钟代替)生成随机数。这意味着,如果知道了种子和已经产生的随机数,就可能获得接下来随机数序列的信息,这就是伪随机数的可预测性。

下面的代码,很容易证明Python的random内置模块所生成随机数的伪随机性。

>>> import random
>>> random.seed(12345)
>>> [random.random() for i in range(3)]
[0.41661987254534116, 0.010169169457068361, 0.8252065092537432]

random.seed() 函数指定伪随机数生成器的初始化种子为12345,在该条件下生成的随机数序列是固定的。上面的代码显示了前3个随机数。在任意时刻,再次使用相同的种子初始化伪随机数生成器,那么接下来生成的随机数就是可预测的(已知的)。

>>> random.seed(12345)
>>> random.random()
0.41661987254534116
>>> random.random()
0.010169169457068361
>>> random.random()
0.8252065092537432

可见,random生成随机数的确是伪随机数。那么,如何生成真正意义上的随机数呢?在一个封闭的系统内,因为计算机硬件是确定的,代码是固定的,算法是准确的,通过这些确定的、固定的、准确的东西不会产生真正的随机数,除非引入这个封闭系统以外的因素,比如天空云朵的形状、邻居家无线网络信号的强度、海岸线形状等。

不过,要想引入封闭系统之外的随机因子并非易事。在某些计算机系统中,使用电路的热噪声来产生真随机数。这究竟是不是真正意义上的随机数,我对此持怀疑态度,因为热噪声的某些特性是可预知的,比如,芯片功耗越大,发热量越大;环境温度越高,散热效果越差。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付 15.20元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值