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

举报
天元浪子 发表于 2021/07/26 22:50:10 2021/07/26
【摘要】 先说结论:不止Python的random内置模块,还包括numpy的随机抽样子模块random,以及其他编程语言的随机数生成器,例如java.Math.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]

  
 
  • 1
  • 2
  • 3
  • 4

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

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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

文章来源: xufive.blog.csdn.net,作者:天元浪子,版权归原作者所有,如需转载,请联系作者。

原文链接:xufive.blog.csdn.net/article/details/114368082

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。