“真随机”指的是“原则上不可预测”。要讨论计算机随机数是不是真随机,我们要从随机数的生成说起。
计算机在底层一般是这样生成随机数的:
- 首先,从“外界”获取一个数,作为“种子”
- 基于这个种子进行一系列运算,得出一个结果,作为生成的随机数。
这“一系列计算”,都是确定性的计算。换言之,对于同样的输入,让计算机算上成千上万次,算出的结果永远是一样的。常规计算机在设计上就是确定性的。
所以,为了得到随机数,我们需要从外界引入一个数、一个不断变化的数,作为种子,以此来引入不确定性。我们常用的种子包括:
- 现在的时间
- 某些硬件存储器中的值(这个值在计算机运行中会被其他不相干的程序重新计算,不断变化,在硬件中这种数是存在的)
可能有读者会问:既然“种子”已经在不断变化了,那我们直接用种子不就好了,何必再进行“一系列计算”呢?
答案在于“分布”。假如我们以时间为种子,但是这台计算机时钟不够完美,每两秒中才跳一次,那我们采集到的时间只能是10:00:00,10:00:02,10:00:04……如果不做进一步处理,得到的将全是偶数。要是被用来做计算机模拟,生成奇数便加一个男性NPC,偶数便加一个女性NPC,那便会生成出一个“女儿国”。类似地,如果种子是正态分布的,拿来给车子摇号也不会合适,只有先把他们重整成均匀分布,摇号才会公平。而这一系列计算就是重整的手段。
综上,随机数生成包括两部分:1)种子:引入不确定性,2)计算:改变种子的分布规律。
说了这么多,计算机中的随机数究竟是真随机数还是伪随机数?这要取决于计算机获取的种子,如果种子是真随机的,那便可能是真随机的。如果种子是伪随机的,那便一定是伪随机的。
从“原则上不可预测”的定义来讲,常规计算机取的都是“伪随机数”。因为计算机在设计上就是执行确定性运算。即使你将时间作为种子,只要你足够了解计算机的初始状态,了解计算机的运行过程,原则上他之后的所有行为、状态都是可以预测的,包括他生成随机数时时钟的读数。
当然,这个预测就如同精卫填海,在当前的现实中是不可行的。所以真伪随机数,一般是理论家比较关心的事情。如果你的随机数理论上可以预测了,那理论上你也可以算出福利彩票的中奖号码,此时随机数只能算是单纯的采样,不能算作随机了。如果以后计算机状态的预测变简单了,这是个大问题,但现在不是。所以,在生活中,我们完全可以将这些随机数当做真随机数。既然现在所有人类猜中它的概率都是均等的,何必管它理论上还有什么问题!
回到题主的问题,现在可以利用量子效应生成真随机数。因为量子物理学家说,量子世界中有些东西在原则上无法预测。(其实仲裁“原则上”可预测和不可预测的就是物理学家,他们觉得经典物理世界都是可预测的。这个就别问我了,咱也不知道,咱也不敢问,谁叫咱脑子不够用……)
当伪随机数无法生成理想的分布,或者我们需要更绝对的随机时,真随机数会有帮助。我想现在应该没什么帮助……欢迎大家指正。
Cloudflare设置了一个有一百盏熔岩灯的墙,然后用相机每隔一段时间拍摄一张照片,通过计算照片中的像素,作为加密的种子。所以说单靠计算机确实无法生成真随机,需要通过现实中不可预测的事情生成。