随机数真的存在吗?
来讨论这个问题前,我们先定义下什么是随机数,通常我们指的的是一个结果,且不可预测,并且每个可能的结果都有相同的概率。
但是,在科学的世界里,随机从来就不存在,因为科学研究的是确定性、可重复的。不确定的、不可重复的随机数,完全是不科学的。
冯诺依曼: "任何考虑使用数学产生随机数的方法都是不合理的"
那么在计算机领域,我们的随机结果真的随机吗?很遗憾,编程语言的的随机数,要么是骗机器,要么是骗人的,严格一点,我们把它叫做伪随机数。
真随机与伪随机
区分真随机数和伪随机数是非常重要的。真随机数的生成通常依赖于物理过程,如前文提到的放射性衰变或电子噪声等。这些过程的不可预测性来自于量子力学的原理,提供了一种理论上不可破解的随机性。相比之下,伪随机数更多是通过一个确定的算法生成的,在绝大多数的编程语言中,生成随机数的逻辑都是通过一个固定算法实现的,比如 python 使用的是 Mersenne Twister算法,java 使用的是 LCG 算法。如果知道了算法和种子(初始值),那么你所谓的随机数实际上是可以被预测的。
随机数也有强度吗?
Mersenne Twister 是一种伪随机数生成算法,由松本真和西村拓士在1997年开发。
尽管 Mersenne Twister 提供了优秀的统计属性和长周期,但它在某些条件下是可预测的。如果攻击者能够观察到足够数量的连续随机输出(通常需要624个连续的随机数),他们可以使用这些输出来“重建”内部状态,并预测之后生成的所有随机数。这种方法通常被称为“状态复原”攻击。
我们评估算法的强度,会考虑在算法已知的情况下,预测生成随机序列的难度来决定。在安全性上,种子和算法通常都需要保密,防止被人复现随机生成器的输出。
随机数真的随机吗?
最后回到我们的标题上来,随机真的随机吗?我们可以得出结论
纯粹通过确定性的数学过程(即算法)生成的序列无法真正实现随机性。算法总是会遵循固定的规则,所以其输出也是可以预测的,只要你知道了它的规则和状态。
参考: 《实用密码学》 - 范学雷