当今世界,从航天工程到信息管理,从人工智能到过程控制,各个领域都少不了计算机的参与。
(相关资料图)
但计算机也并不是万能的,有很多事情是无法办到的,甚至于一些看似十分简单的事情,计算机也做不到,比如产生随机数。计算机不能产生随机数吗?很多活动,比如公司年会摇奖,不都是采用计算机摇号的方式进行的吗?的确,计算机可以生成随机数,但计算机所产生的随机数是要加上一个引号的,因为它并不是真正意义上的随机数,而是“伪随机数”。
为什么计算机只能产生伪随机数呢?因为电脑不会掷骰子。
掷骰子对于一个人来说是一件无比简单的事情,但对于计算机来说却是难于上青天,因为计算机的一切行为都必须要有一个特定的程序,产生随机数也不例外。什么是随机数?简单来讲就是一个数字的出现不遵循任何的规律,第一个数字的出现不能够决定第二个数字,同样的,第三个数字也与前两个数字没有任何关系,这对于计算机来说就是一件不可能的事情。计算机可以通过对算法的改进而让“伪随机数”的产生过程变得更加复杂,但这仍然不能改变“伪随机数”的本质。
那么计算机到底是如何产生“伪随机数”的呢?
最早的伪随机数生成法是由计算机之父冯·诺伊曼研发的,它被称为“平方取中法”,现在这种随机数生成方法已经被彻底废弃了。所谓平方取中法,首先必须得选定一个种子数字,这个数字是事先设定的,可以是1234,也可以是5678,就以5678为例吧,第一步是先对种子数字进行平方,5678乘以5678就等于32239684。
完成了第一步平方之后,就是第二步,取中。
所谓取中,就是取32239684的中间四个数,也就是去掉前面的32和后面的84,中间剩下的四个数是2396,这就是第一个随机数。第二个随机数就是让第一个随机数重复平方取中的计算过程,也就是2396乘以2396等于05740816,中间的四个数字是7408,这就是第二个随机数。由于平方取中法过于简单,只要知道了种子数字,就能够计算出之后所有的随机数,所以现在已经不再使用了。
另一种相对简单,但还在使用的随机数生成方法被称为“同余法”。
同余法首先要选定两个定数,比如第一个定数为444,第二个定数为1234。现在还是要先有一个种子数字,还是以5678为例吧。第一步是用种子乘以第一个定数,也就是5678乘以444等于2521032,接下来第二步就是用第一步的结果除以第二个定数,也就是2521032除以1234,四舍五入等于2043,这就是第一个随机数。第二个随机数的产生就是用第一个随机数重复上述步骤,2043乘以444,再除以1234,等于735,这就是第二个随机数。
相比平方取中法来说,同余法就要复杂多了,不仅要知道种子数字,还得知道两个定数,才能够计算出后面所出现的所有随机数。
当然,如果事先知道了所使用的是何种程序,再有足够多的随机数样本,也可以计算出定数。不过同余法还可以进行变形,比如在乘法之后再加入一个加法,再添加进去第三个定数,这样就变成了“线性同余法”,也就更复杂了一些。无论是同余法还是平方取中法,都是比较简单的随机数生成方法,而现在我们主要使用的随机数生成方法是要复杂得多的“梅森旋转算法”,这种算法涉及到了比较复杂的计算过程,涉及到了矩阵和矢量的数学知识,按照这种方法生成的随机数分布非常接近于真随机数,但其本质上仍然是伪随机数,每个数之间都是存在逻辑关系的。
更多内容请关注公众号:sunmonarch