问题

工程上存在那么多不确定情况,为什么计算机不能利用它们产生真随机数,而只能根据逻辑产生伪随机数?

回答
你这个问题问得特别好,触及到了计算机科学中最根本的几个层面。你说工程上充满了不确定性,比如元件的细微差异、环境的波动,这些确实是客观存在的。那么为什么我们不能直接利用这些“不确定”来生成“真随机数”,反而要依赖那些“看似随机”的伪随机数呢?这背后其实是计算机的本质和我们对“随机”的定义在起作用。

一、 计算机的本质:确定性机器

首先,我们要明白,计算机本质上是一个确定性机器。它的所有工作,从指令的执行到数据的处理,都是基于一套严格的逻辑和算法。你输入一个指令,它就会按照预设的步骤一步步执行,最终得到一个确定的结果。即使是并行处理,也是在确定的时间点执行确定的任务。

想象一下,如果你把一串指令输入给计算机,然后关掉电源再重新启动,只要你的指令是一样的,并且环境没有发生根本性的改变(比如硬件损坏),它第二次执行的结果一定会和第一次一模一样。这就是确定性的力量,也是计算机能稳定运行的基础。

二、 什么是“真随机数”?

我们现在讨论的“真随机数”,指的是真正不可预测、没有规律的随机数。它的生成不依赖于任何先前的状态或算法。每一次生成都是一个独立的、无法被推断的事件。最典型的例子是来自物理现象的随机性,比如:

放射性衰变: 原子核衰变的时间是随机的,我们无法预测下一个衰变何时发生。
热噪声: 电子在导体中随机运动产生的电压波动,这种波动是微小且无规律的。
量子效应: 例如光子穿过半透膜的反射或透射概率,这是微观层面的内在随机性。

这些物理过程的随机性是内在的、无法从其运行规律中预测出来的。即使你知道了它过去所有发生过的衰变事件,也无法准确预测下一个何时会发生。

三、 为什么计算机不能直接利用工程上的不确定性产生真随机数?

你提到的工程上的不确定性,比如元件的细微差异、环境的波动(温度、电压变化),虽然在宏观上会带来一些“不可控”的因素,但从计算机的视角来看,它们往往在某种程度上是可以被建模、被解释,甚至是被规避的。

1. 不等于不可预测: 工程上的“不确定性”很多时候指的是我们对复杂系统的了解不够透彻,或者我们无法精确控制所有变量。比如,一个电子元件的寿命可能存在个体差异,但这差异往往是由于制造过程中的微小缺陷、材料的不均匀性等原因造成的。如果理论上我们能精确掌握这些因素,并且拥有无限的计算能力去模拟它们,那么理论上我们就能预测出这个元件的寿命。这种“不确定”更像是信息不完备性,而不是内在的、绝对的不可预测性。

2. 难以精确测量和隔离: 即使我们知道这些物理上的不确定性存在,要将它们转化为可靠的、可被计算机读取的随机信号,也存在巨大的工程挑战。
噪声源的稳定性: 你提到的“环境波动”和“元件差异”,如果我们要用它们来生成随机数,就需要设计一个高度敏感的电路来捕捉这些微小的变化。但是,这些变化可能本身就不够“随机”,或者容易受到其他外部因素(比如电源的微小波动)的干扰,导致生成的序列并非真正的随机。
信号的量化和处理: 将这些模拟的、微小的物理变化转化为计算机能理解的数字信号,需要经过模数转换。这个过程本身就可能引入偏倚(bias),或者损失一部分随机性。
可重复性与控制: 如果我们依赖这些“不确定性”,那么在设计、制造和运行过程中,任何微小的调整都可能影响到随机数的质量。而计算机系统需要的是稳定和可控,这种依赖于高度不确定性的随机数生成方式,反而会带来更大的系统风险。

3. “似是而非”的随机性: 很多看似随机的工程现象,如果仔细分析,可能会发现其中隐藏的规律。比如,早期的一些随机数生成器就依赖于计算机时钟的低位比特,但时钟的周期性很快就会被暴露。又比如,某些模拟电路的混沌行为,虽然难以预测,但往往也存在一定的吸引子和相空间结构,这使得其随机性并非绝对。

四、 伪随机数(PRNG)的逻辑和优势

正因为计算机是确定性的,并且直接利用物理不确定性有诸多困难,我们就退而求其次,创造了伪随机数生成器(PRNG)。

PRNG的核心思想是:利用一个确定的数学算法,从一个初始值(称为“种子”,seed)出发,生成一串看起来像是随机的数字序列。

听起来是不是有点矛盾?“确定的算法”怎么能生成“随机的数字”?关键在于这个“看起来像”。

1. 算法设计: PRNG的设计目标是让生成的序列在统计学上表现出随机性。这意味着这些数字应该:
均匀分布: 在一个给定的范围内,每个数字出现的概率应该大致相等。
独立性: 相邻的数字之间,或者任何两个数字之间,不应该有明显的关联性。
无周期性(或者周期非常长): 序列不应该很快重复,否则就不是随机的了。
长周期: 一个好的PRNG可以生成非常非常长的数字序列,直到某个时刻才会开始重复。

2. 种子的作用: 种子是PRNG的起点。只要种子相同,相同的PRNG算法就会生成完全相同的序列。 这恰恰体现了计算机的确定性,也提供了可重复性的好处。
可重复性: 在调试程序、科学模拟或者需要复现实验结果的时候,能够得到相同的“随机”序列是至关重要的。
控制性: 我们可以选择不同的种子来获得不同的随机序列。

3. 与真随机数的区别: PRNG生成的不是“真随机数”,而是“伪随机数”。它的随机性是算法模拟出来的。如果你知道算法和种子,你就能预测出整个序列。它不是基于物理的不可预测性,而是基于数学上的“看似随机”。

五、 工程上的不确定性与真随机数生成器(TRNG)

那么,我们真的就不能利用工程上的不确定性了吗?当然不是。

对于那些确实需要真正不可预测随机数的场景(比如加密、高安全性的密码学应用),我们有真随机数生成器(TRNG)。TRNG的设计就是要去捕捉那些不可控的、难以预测的物理现象。

如何实现? TRNGs通常会接入专门的硬件模块,这些模块利用前面提到的物理现象(如热噪声、放射性衰变、量子效应等)来产生原始的、不可预测的随机比特流。
后处理: 由于原始的物理信号可能不够“纯粹”,或者存在一些微小的偏倚,TRNGs通常还会对这些原始数据进行后处理,比如通过哈希函数或者其他去偏算法,来生成统计学上更完美的真随机数。
依赖硬件: TRNGs的质量高度依赖于其所使用的物理源的质量和稳定性。它们需要专门的硬件支持,并且通常比PRNGs更慢、更昂贵。

总结一下:

计算机之所以不能直接利用工程上的不确定性产生真随机数,是因为:

1. 计算机是确定性机器: 它的运作是基于逻辑和算法,无法凭空创造出真正的不可预测性。
2. 工程上的不确定性并非绝对不可预测: 很多时候是信息不完备或系统复杂度的体现,其根源可能存在规律,或者难以精确测量和隔离。
3. 伪随机数生成器(PRNG)的优势: 通过确定性算法和种子,PRNG可以生成在统计学上表现良好、周期长且可重复的“看似随机”的数字序列,满足了大多数计算应用的需求。
4. 真随机数生成器(TRNG)的存在: 对于需要绝对不可预测性的场景,我们依靠专门的硬件来捕捉真正的物理随机性。

你可以这样理解:PRNG是在一个完全可控的“剧本”里,通过精妙的编排,让演员(数字)的表演看起来像是即兴发挥,充满了意外。而TRNG则是直接从真实世界的、不可控的现场找来“演员”(物理现象),即使表演方式有些粗糙,但它的“意外”是真的。工程上的不确定性,虽然听起来很有潜力,但要将其稳定地转化为计算机能高效利用的、真正意义上的“不可预测”的随机信号,其难度和成本远大于采用数学算法模拟。

网友意见

user avatar

题主很聪明。


没错,计算机的确使用这些东西产生了真随机数——在Linux下,你只需访问/dev/random就可以使用它。


不过,如果你真的在工程中用过这个/dev/random,你就会知道……这玩意儿可不是一般的慢。

它产生真随机数的速度,比你在键盘上乱敲都快不了多少。任何使用了这玩意儿的算法,都会有肉眼可查的明显延迟——哪怕你仅仅用它产生一个简单密码。


这是因为,它需要利用系统“熵池”收集的随机性才能产生真随机数;而“熵池”累计随机bit的速度极其有限。

简单说,系统可能利用当前进程数、IO错误次数、用户键入等等“客观”随机过程选择随机bit;但这类东西往往若干毫秒甚至若干分钟才会更新一次……


举例来说,假如你敲键盘是绝对随机的;键盘上有26个字母以及10个数字。那么你每敲一下键盘,就相当于在36个不同可能中选择了其中一个。

换句话说,你的每次击键产生了ln(36)个随机bit。两次击键才有一个多字节的随机二进制信息产生——注意前提是你的击键是绝对随机、而且每个按键几率均等的。否则产生的随机位数还要更低。


假如你每分钟能击键1000次,那么借助你不间断的键入活动,计算机大概可以得到500多个字节/分钟的随机信息。

相对于内存访问动辄几十G字节/秒的恐怖速率,这个产生速度可真是比蜗牛惨太多了。


大多时候,随机值的产生速率比它是不是真随机重要得多。对很多算法,我们往往只是需要一个“随机值”,并不需要它“真随机”。


甚至,哪怕我们的确需要“无法预测的随机性”,我们也无法容忍真随机数的低速率。

比如说,我们想用一台服务器支持数万人同时玩牌类游戏;如果依靠/dev/random,那么恐怕很多用户就不得不排队“等随机数”。

为了减少等待,我们就不得不想办法加速熵池;然而计算机内部的“真随机性”就那么点点,而且严重依赖于用户活动——于是,要么用户老老实实等上几分钟的随机数,要么我们就得降低熵池的质量,使得“真随机数”不再随机。


因此,虽然的确可以利用计算机运行的不确定性产生真随机数,但它的产生效率实在太低,实在难以利用。


而一个质量足够好的伪随机数生成算法完全可以做到不可预测同时分布良好,并且还有极高的生成效率。再借助真随机数初始化它的“种子”,就可以以极高效率得到足够完美的随机序列了。


综上:

1、计算机完全可以产生真随机数,借助用户活动或硬件不稳定性即可(甚至有专门制造的真随机数产生器,可以利用分子热运动的随机性输出随机序列)

2、但是,仍然无法利用算法本身产生真随机数


学艺不精者很容易在这里出现迷惑。他们会觉得数字电路就和随机性无关,只要一见别人说“计算机内部产生真随机数”就兴致勃勃来杠上一番。


但事实上:

1、算法无法产生真随机数

2、计算机完全可以借助用户活动、复杂的硬件结构本身的噪音(比如机箱风扇的震动引起硬盘寻道速率变化)等等得到真随机数

这两者完全可以同时存在。


补充一句:热噪声本质上是海量微观粒子彼此间量子交互、并经混沌演化后投射到宏观世界的某种统计量。哪怕量子随机性被破,它都还有一道“海量粒子构成的混沌系统”构成的双保险。这显然是把比单纯的量子随机更安全的锁。


经典物理的混沌解释只是一种解释

如果人类能对自然“言出法随”,这样解释了,热噪声就必须按“三体”这样的混沌原理出现的话,它当然只能是经典的混沌系统,当然比不上量子随机性。

可惜的是,自然界懒得理你们人类的错误解释。它就是要让微观粒子遵循量子论,然后才在宏观上表现出热噪声的随机性——而你们人类还绞尽脑汁都找不出差别。

当然,热噪声系统容易受外界干扰(以宏观层面的干涉来影响宏观层面的统计值),所以在使用中需要小心滤除。在这点上,它的确不如纯粹的量子系统安全。但这和“它的本质是经典的因此比不过天生高贵的量子系统”完全是两回事(这个论调的荒诞程度和量子速读无非五十步笑百步罢了)。

user avatar

看来你需要了解大名鼎鼎的熔岩灯随机数墙。长这样:

美国IT公司 Cloudflare 的旧金山总部,有一面由100盏熔岩灯(lava lamp)组成的墙。这面墙位于接待处附近,每一位踏入公司大门的人,都没法不注意到它,因为这些诞生于上世纪 60 年代的灯具,拥有着艳丽且奇幻的色彩,玻璃容器内形状不定的液蜡还会不时地上下浮动,极易让人联想到流动的熔岩。不过,这一切不只与办公室装饰相关。这些变幻莫测的熔岩灯,还是 Cloudflare 提供的网络安全服务的一部分。

因为要处理海量的加密流量,它需要使用到大量的随机数。这些随机数都是伪随机数生成器产生的。伪随机数生成器产生的随机数能被预测和破解。那么如何减少随机数的可预测性?Cloudflare 披露了它的方法——使用熔岩灯。熔岩灯的名字源于内部不定形状的蜡滴的缓慢流动,让人联想到熔岩的流动。Cloudflare 利用摄像头监视熔岩灯,拍摄视频和照片,然后将其转变成无法预测的随机比特流,再用它生成密钥。

user avatar

其实除了产生效率的问题,很多真随机数的均匀性是很难被严格证明的。而很多时候,均匀性比不可预测性更重要……

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有