公众号后台回复“图书“,了解更多号主新书内容
作者:天元浪子
来源:Python作业辅导员
先说结论:不止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生成的随机数的确是伪随机数。那么,如何生成真正意义上的随机数呢?在一个封闭的系统内,因为计算机硬件是确定的,代码是固定的,算法是准确的,通过这些确定的、固定的、准确的东西不会产生真正的随机数,除非引入这个封闭系统以外的因素,比如天空云朵的形状、邻居家无线网络信号的强度、海岸线形状等。
不过,要想引入封闭系统之外的随机因子并非易事。在某些计算机系统中,使用电路的热噪声来产生真随机数。这究竟是不是真正意义上的随机数,我对此持怀疑态度,因为热噪声的某些特性是可预知的,比如,芯片功耗越大,发热量越大;环境温度越高,散热效果越差。
◆ ◆ ◆ ◆ ◆麟哥新书已经在当当上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前当当正在举行活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
管理员二维码:
猜你喜欢
● 卧槽!原来爬取B站弹幕这么简单● 厉害了!麟哥新书登顶京东销量排行榜!● 笑死人不偿命的知乎沙雕问题排行榜
● 用Python扒出B站那些“惊为天人”的阿婆主!● 你相信逛B站也能学编程吗