许多游戏都会设置抽签环节,比如:在大热手游《阴阳师》里,游戏角色就需要通过抽签获得。游戏抽签的机制和赌博类似,我们每次抽签,电脑就会生成一个随机数,这个随机数便决定了你抽到的是蝴蝶精还是大天狗(游戏角色)。
除了应用在游戏中,随机数也被用于安全加密方面。为了保证信息的安全,加密系统不能一直使用同一个密码,而是使用一些毫无章法的数字,让黑客根本无法猜测。
然而,电脑没有思想,它只能执行一些人类(程序员)提前写好的指令,也就是说,电脑是确定性的。因此,随机数并不是真的随机,那么它们到底是怎么产生的呢?
伪随机数
我们生活中最常见的随机数被称为“伪”随机数,伪随机数不是真正的随机数,只是看上去像是随机的罢了,这类随机数单纯由电脑程序决定,即它们的产生服从一些既定的规则,比如平方取中法和梅森旋转法。
在平方取中法中,我们先给电脑程序定一个四位的起始值(通常被称为种子),计算种子的平方数,然后提取平方数中间的四个数字。例如,种子为3895,它的平方数为15171025,那么电脑取得的随机数就是1710(中间4位)。当程序继续进行,1710的平方数为2924100,那么下一个随机数就是9241(不够八位数,在前面补0)。这样就能够产生介于0到9999之间的伪随机数。
另外一种产生伪随机数的方法是梅森旋转法,使用这种规则产生的随机数需要四个数:m、a、c和种子数(初始值),计算随机数时,我们先用种子数乘以a加上c,再除以m取余数。例如,m、a、c和种子数分别取值7829、378、2310、4321,那么得到的随机数就是(4321×378+2310)/7829=208……7216。那伪随机数就是余数7216。当然,这个过程继续重复就会产生一系列的随机数。
从上述的两种规则中,我们可以看出,一个数字是由上一个数字所决定的,如果种子不变,产生的随机数序列也不会变,因此,伪随机数可以说是完全不随机的。而且当计算过程重复得足够多时,数列就会陷入循环之中,仅仅是从表面上看,伪随机数也不那么随机了。比如,使用平方取中法生成的数列中的一项是2916,那么接下来就是:5030、3009、540、2916,后面不断重复。
值得一提的是梅森旋转法的输入值只有种子数是可变的,目前90%的游戏都是使用时间作为种子数的,当你打开抽签程序开始抽签,程序就会记录你按键时的时间,比如11点32分43.576836秒,使用小数点后的三四位68作为种子。一旦种子确定了,后面的随机数序列其实就已经确定了。因此,当你抽签老是失败时,不妨重启程序,或者换个时间试试。
而m、a、c这三个数字是由程序员预先确定好的,它们的数值已经写在了程序里,它们可以是2位数也可以是4位数。对三个数字的要求是:程序员要提前测试,使得出的随机数重复之前,这个公式必须产生了0到m之间的所有数,而且产生的序列应该看起来是随机的,否则就要重新设定m、a、c这三个数字。
真随机数也不一定随机
除了伪随机数,实际上计算机还可以生成一类“真”随机数。
为了生成真随机数,计算机需要测量某种随机的物理现象。例如,我们可以测量某一时刻的大气噪声(自然界雷暴活动所产生的电磁辐射),测量显示的数字就可以输入电脑,作为一个随机数或者被电脑“加工”成一个随机数。此时,计算机便引入了自然界的随机性。
前文中的“时间种子”也是真随机数,因为人在什么时候按下起始键是无法预测的。不过,由于真随机数的生成速度太慢了,所以在生活中,人们很少接触到真随机数。然而真随机数一定随机吗?为了搞清这个问题,我们要先明确随机的定义,即当我们无法预测某事物,或者某事物并没有什么明显的模式时,我们就称它是随机的。但某些物理现象其实是确定的,并不是随机的,因此真随机数也不一定随机。
例如,我们一直认为扔硬币是随机性事件,但它本质上并不是随机的,因为如果我们能知道扔硬币时的初始状态,即硬币的受力情况、运动方向和速度等,就可以在硬币落到地面之前,推测出最终结果。在我们抛出硬币的那一刻,它就已经是一个确定性事件了。实际上,已经有研究者建造出了一个扔硬币的机器人,这个机器人可以精确控制硬币的初始状态,来得到任何研究人员想要的结果并且万无一失。
很多时候,事件看起来是随机的,仅仅是因为我们缺少信息,或者预测的过程太过复杂。而且有些事件并不是没有任何模式,有可能我们还没有找到它的模式。
例如,尽管大气噪声非常难预测,但它仍是一个确定性系统。所有的噪声都是从某一个地方产生的,如果我们可以找到噪声产生时的初始状态,在理论上,我们就可以预测噪声的数值。
量子随机性
此时,一个问题可能会萦绕在你的脑海中:在我们知道所有的信息的情况下,有什么事情是无法预测的?答案恐怕只能到量子的世界里寻找了。
如果你还记得薛定谔那只可怜的猫,你应该知道:在我们打开盒子前,这只猫同时处于两种状态,猫既是死的也是活的。这听上去像是一个悖论,然而微观世界的物理规则确确实实是这样的。微观世界粒子的空间分布和动量是完全不确定的(即量子力学的不确定性原理),就像那只猫,如果我们没有打开盒子,猫仍然同时处于两种状态。只有我们看它,它才有了确定的状态。
与经典物理学不同,没有什么其他的信息和计算能让我们对粒子的状态进行预测。不管是一个特定的放射性原子是否会衰变,还是一个电子的旋转方式,只有在我们看粒子的时候才能知道。
随着我们掌握的信息越来越多,计算能力越来越强大,我们将有能力预测出目前无法预测的随机性事件,这一事实令我们感到恐慌,不过幸好我们还有量子随机性。但是如果有一天,我们能够推翻现在的微观物理规则,我们甚至能够准确地预测粒子的量子状态,那么世界将毫无秘密可言,游戏也将毫无乐趣。