龙空技术网

计算机为什么不能生成真随机数、只能生成伪随机数

超全栈裙729240147 4615

前言:

现在同学们对“算法真随机”可能比较看重,同学们都想要分析一些“算法真随机”的相关文章。那么小编在网摘上汇集了一些有关“算法真随机””的相关资讯,希望各位老铁们能喜欢,朋友们一起来了解一下吧!

计算机不能产生真随机数、而只能产生伪随机数,这个结论大家想必并不陌生。计算机之所以对产生真随机数无能为力,可以从以下三个不同的角度进行解释:

1、函数只能是多一映射或一一映射、而不能够是一多映射的;

2、有限状态机在当前状态、根据唯一的信号进行状态转移的途径是唯一的;

3、无法设计出一个输入确定而输出不确定的门电路;

以上三种不同的角度,究其本质是一样的,因而也就导致了无法通过程序产生真随机数。换言之,通过数学算法是无法生成真随机数的。

你也许会说“随机函数random()不就是一个函数、它不就是一个一多映射的函数、用它不就可以产生随机数吗?”

其实随机函数只不过是形式上很类似函数,但它并不能称为“函数”,更准确的说法而是“随机数产生器”。如果你深入到random()函数内部去看,会发现它生成的是一个可预知的数列,也就是说只要你知道这个数列的一部分、那么剩下的数列、下一个随机数将是什么,都是可以预知的。

对于计算机而言,如果想依靠算法产生随机数,无论怎样做,最终生成的都是“伪随机数”,只有在引入物理世界的一些参数的情形下,才能够产生“真随机数”。

例如最常见的是通过采集环境噪音做为随机种子、或者直接采集环境噪音做为随机数。事实上,即便引入物理世界的参数,如果我们严苛的考究,你会发现所产生的随机数依然是“伪随机数”,只不过这样的伪随机数已经很难通过当前的科技手段进行复现和预测了。因而我们将引入了原子衰变、环境噪音等物理世界参数的随机数,从实用的角度将他们认定为“真随机数”。

那么在我们的宇宙中,又有没有真正意义上的随机数呢?答案是肯定的,真正不可能被预知、被复现的,是量子理论下的随机数,因为它的观察不可复现、所以只要产生一次,就再不会重现。而在观察之前,你永远也不会预知其结果是什么,这样的随机才是严苛定义下的真随机数。换言之,在我们这个由经典物理支配的世界中,你是无法获得真随机数的。

有人提出了一个论题:人脑中随机想出的数字、是否是真随机数?

答案是显而易见的,人脑中产生的“随机”数字,也并非真随机,原因是它在大样本的情形下,分布是具有规律性的。这种规律性虽然难以被提问者猜测到、但是却能够被提问者划定出趋势和范围,如此的随机就也不能够成为“真随机”。抛硬币呢?它总归是公平的了吧?也不一定,要知道,硬币的抛出是有一个初始的速度的,这个初始速度与硬币在空中的高度、翻转次数形成对应关系,从而在未经落地前就预测出其结果。

由此看来,我们是不是只能将希望寄托于量子理论?如果我们的世界上没有随机数,那将是什么样子呢?在没有随机数的情况下,我们的世界将会变得十分枯燥,你不能够再去购买彩票、不能够打星际争霸、甚至连网银都无法使用了……今天的绝大多数密码通信都将荒废、所有的人工智能都将变得呆板无趣……

我想不会有人能够忍受这样一个枯燥乏味的世界吧?好在伪随机数虽然“有些小遗憾”,但是它也足够使用了,在统计意义上讲,伪随机数可以认为是足够贴近真随机的,因而利用它,你能够享受到密码学、AI等各个领域的技术。

最常用的伪随机数产生器,是“线性同余法”进行随机数生成,这个算法速度快、形式简单,非常高效。在明天的文章中,我将对线性同余法进行一个更详细的介绍,并给出实现程序来验证它的“随机性能”。

标签: #算法真随机