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

本文揭示了Python和Java的随机数生成器实际上是伪随机数,通过固定算法和种子生成看似随机的序列。讨论了真随机数的不可预测性,并介绍了如何区分伪随机与真随机。还探讨了在实际应用中生成真随机数的挑战和可能性。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值