最近支付宝锦鲤的出现,敲碎了300万人的暴富梦。抽奖这种随机发生的事情,为啥放到自己身上来说就等于“绝对不可能发生”呢。还有平时打网游,想要的任务材料和装备,人家随便暴,自己死活就是不暴。玩儿lol,60%暴击率连打别人三下都不暴击,别人15%暴击率打你连续暴击两回把你反杀了。人生就是如此反复无常。人生反复无常是没错,但是上面由计算机产生的“随机”,真的是反复无常的吗?
计算机产生的随机数,其实是伪随机“pseudorandom”,或者说是模拟出来的随机数。换句话说,你打怪不掉装备,不出暴击被人反杀,其实都是“被安排好了的”。最直观的例子。比如你音乐播放软件里的“随机”播放功能,其实只是把你的歌单打乱然后依次放一遍。这不算是随机吗?如果是真随机,你是有可能听到歌曲重复播放的,概率还不小。
但事实上,几乎所有播放软件的随机播放,同一首歌曲只会放一遍,而且如果你选择“上一首”就一定能听到上一首。一般情况下,电脑是无法自己产生真随机的。你想想,计算机的一切行为都是人类写代码设定好的,因此在没有输入的情况下,你问它随便凭空给个玩意。它还真就给不了!但现在有很多场景确实需要计算机“随机”点儿啥,比如游戏,抽奖。于是。就有了各种各样的,用来让计算机生成随机数的伪随机算法。
C++里的伪随机数计算公式这种算法一般是个函数:你输入一个东西,就会输出一个东西。比如你要模拟掷骰子,给这个算法输入一个数字[561981980],限制结果是1-6的整数,运行一下输出一个数列:[3,3,4,1,6,5,1,3,2,5]。然后。运行那个随机算法以后,这些生成的随机数就在那儿了,你每次管计算机要个骰子,它就按照数列的顺序给你一个,不和你说,就以假乱真了。
在上面提到的场景里,数字[561981980]被称作随机数种子。大多数随机数算法,都要个随机数种子,来给函数作计算,一旦种子确定下来以后,生成的“随机数”其实是有个确定的随机数表的。但并没有啥关系,只要函数够复杂,周期性非常长,那么这个产生的随机数表就几乎无法预判。游戏《文明6》生成游戏地图就可以选择种子因此生成的函数对伪随机算法很重要。在网上有人做过测试,把随机数可视化之后可以生成噪点图来看。
这是C语言在linux环境下调用随机数的排列结果可以看到,分布很平均。不过在Windows下的PHP随机数算法,就能看出些规律,说明效果没有上面那个好。除了算法,还有在随机数种子上做文章的。有的算法使用外部因素来产生种子,这种外部因素被叫做噪声源。不少算法会调用当前系统时间当作随机数种子。这个办法理论上够随机了,毕竟啥时候需要随机数是人来决定的,而人是感情的动物,做事儿极其没有规律。
但是时间这个事情,在某种程度上是依旧可预测的。因此还有更进一步的算法,例如Linux内核里有一套方法,从使用计算机硬件的人身上获取噪声。这个噪声可以是两次键盘敲击的时间间隔,某一次鼠标移动的距离。这些事情对计算机来说是不可预测的。这个方法从理论上来说,产生的是真随机数。为啥是理论上来说呢?先想想这个问题:我们理解的现实世界中的“真随机”,真的是完全随机的吗?
如果能搞清楚一颗骰子处的位置,桌子的材料,摩擦,空气阻力,投的人用多大的力。不管多复杂,其实理论上通过数学和物理学工具是可以算出结果的。人的行为也类似,人的当时的状态心情,和他从小到大的遭遇见闻,接受的教育是已知的情况下,理论上也许能算出一个人的下一步行动。嗯。发现没,这个问题再讨论下去,就马上要跳出物理学数学心理学的范畴,进入哲学的领域了。
如果看了这篇文章导致你需要随机数的时候,再也不相信手机APP生成的结果的话。试试这个网站:random.org绝对不是什么推广,国内上这个网站贼卡这个网站可以帮你产生各种随机数,给定一个范围就能生成数字,生成随机数种子的噪音源取自大气里的分子运动现象,广义上来讲,也算真随机了。这么说下去,既然电脑里的随机都是“安排好的”,咱们游戏还玩儿吗?
照样玩儿,因为一般情况下,伪随机拿来模拟真随机是够用的,我们的世界一直就是这么过来的。至于现实生活有没有随机这个事情,也别纠结了,好好生活,把问题留给科学家和哲学家吧。