随机数在生活中处处可见,比如要随机抽取一位幸运观众上台表演,用转盘随机选出今晚吃什么,简单到如抛硬币这样的动作,复杂到遗传算法中新种群的生成,这些都离不开随机数在背后的支撑。
随机数看似十分简单,正如它名字那样,只需要“随机”地产生一个数字就行了。但是真正弄清楚其原理则要等到近代统计学的兴起和发展了。而对于计算机而言,怎样实现随机数也是一个令人头疼的问题。在现代,应用最为广泛、被大部分编程语言采取的随机数生成方式是使用伪随机数,这样的随机数通常需要一个种子,即一个初始数字作为参数,并通过平方取中等方法一步步构造一个数字序列。种子一旦确定,那么可想而知,在同样的算法下,生成的随机数序列一定是相同的。这就是为什么要把它称作伪随机数的原因。不过虽然伪随机数并没有实现真正的完全随机,但它与随机数只差一个字,与真正随机也仅差了需要种子这一机制。其实,目前好像只有量子力学中关于微观粒子运动的描述呈现出真正随机这一特点。而对于我们常见的“真正随机”,如抛硬币这样的看似随机的动作,事实上也是取决于一系列如地心引力、海拔、风速、空气密度、初始受力等诸多因素的函数,在这样的观点下,抛硬币也可以算作是伪随机了。
既然现在实现完全随机还比较困难,那么我们能不能寻找一些更加简单的随机数生成方式呢?也许有的小朋友在某天上数学课发呆的时候会突然想到,能不能用作为随机数的生成方式,这位小朋友通过简单的推理,可能会发现,如果每次取1位数字,依次向低位取,这样不就得到了一个随机的0到9的数字序列了吗?是的,呈现出的特点让我们有理由这么想,但是真的要这么做的话就必须面临一些应用问题。
首先,我们必须验证的数字序列是否是随机的,为此需要考察各位出现的概率。但又是无限不循环小数,虽然以人类目前的算力,已经能够将其算到小数点后60万亿位,但我们仍不能直接证明各位出现的概率相等。那么,假如我们套用一下统计学中的“大数定理”,认为60万亿位已经能够反应整体性质了,于是就可以进行下一步的验证。因为计算能力有限,我计算了圆周率前10万位中各位数字出现的频率,结果如下:

统计学的知识差不多忘了,但从直观上看,这个结果确实说明了,在上述假设前提下,圆周率各位数字的出现概率很可能是十分接近的。
(未完待续)