首发于TodayILearned
看上去随机

看上去随机


电脑里的随机数是怎么产生的?你可能听说过“计算机里没有真随机数”这种说法,不过事实也不尽然。虽然电脑里面的随机数大多数都是算法生成的随机数,就是所谓“伪随机数”,但实际上也有一种硬件生成的随机数,算是“真随机数”。

伪随机数会从一个随机的种子(比如系统时间)开始,然后用一套固定的公式进行迭代产生一系列数字。这样生成的数列通常具有周期性,但是周期特别大。比如在C++和Python等多种软件中默认使用的随机数算法叫梅森旋转算法,其周期高达2^19937-1(这是一个梅森素数,即形如2^n-1这样的素数),远大于通常需要使用的随机数的个数。这类算法所生成的并不是通常意义上的随机数:因为如果你拿到了随机数种子,就可以完全复现接下来的所有随机数——这在具体问题上可能是好事,也可能是坏事。

而真随机数则正好相反。它会用一系列确实无法预测的事件作为输入。比如点击鼠标的间隔,鼠标划过的长度,敲击键盘的频率,网络事件的突发事件等等。一些系统驱动通常会在对这些数据进行处理之后将它们存进一个被称为熵池的存储区。需要读取随机数的时候就从熵池里面取数据。这样得到的确实是无法预测的随机数,但是随机数的数量是有限的,不能超过随机事件的频率。熵池内的数据被用光了而又没有新的随机数存进去的话,那么暂时就没法调取真随机数了。Linux系统所使用的熵事件所产生的随机数频率在每秒2-5比特左右。除此以外,还有一些专门的硬件真随机数生成设备,使用类似热力学噪声、光电效应、量子效应等在理论上不可预测的物理过程来制造真随机数,例如Whitewood公司提供的量子随机数生成器,它生成随机数的速度可以达到每秒100M。

实际上,不管是真随机数还是伪随机数都会保证算法生成出的数列满足统计上的随机性,因此在使用时的效果上没什么本质差别。当然,也有一种说法认为除了量子效应以外其他的“随机”事件并不是真的随机,因此即使是“真随机数”,也只是一种足够好的近似而已。

PS:本文所讨论的是产生均匀随机数的方法。不过,“均匀的随机数”对很多人的直觉来说并不够均匀,特别是在脸黑的时候尤其如此。所以,很多游戏中可能会使用小周期随机池或是软保底等方式给人带来更加“公平”甚至实际是对玩家有利的随机体验。不不不,我说的不光是手游。实际上就连著名的席德梅尔也在访谈中提到,《文明》系列为了让玩家感觉到更公平而把实际的胜率和判定胜负的随机性向玩家有利的方向调整了。

PSPS:你能看出图中正在玩的游戏是哪三个么?

cite:techcrunch.com/2016/03/

blackhat.com/docs/us-15


如果你喜欢这个系列的漫画,欢迎把它推荐给你的朋友,也欢迎关注公众号TILcomic~

---------------------------------------------

本篇的彩蛋:


编辑于 2017-07-19 10:05