计算机如何产生随机数?

最近遇到一个很有趣的问题,如何产生一个随机数?有人可能会说,这有什么难的,每种编程语言都有 random 函数,直接调用不就就可以得到很多随机数吗?的确,这些 random 函数确实能产生一些看上去随机的数。但事实上,一般计算机产生的随机数并不是真正的 ”随机”,而是统计意义上的随机,一般称为伪随机。

我们下面以 python 为例,看看计算机产生的随机数是什么样的:

首先导入 random 库:

import random

a = random.random()
print(a)

多次执行,产生的结果依次为:

0.09750019933054854
0.3646950242728466
0.4944332586714282 
0.8269252120297756
0.7433732383902878 

每次结果都不一样,看上去是挺随机的。

但是我们给这个随机数加上一个 seed(种子)试试:

import random

random.seed(1)
a = random.random()
print(a)

多次执行,产生的结果依次为:

0.13436424411240122
0.13436424411240122
0.13436424411240122
0.13436424411240122
0.13436424411240122

产生的结果都是一样的,那说明加了这个 seed 之后,随机数变得不随机了,计算机每次产生的随机数,都和这个 seed 有关系。真正的随机应该是谁也控制不了的。

目前来说,随机数生成器分为真随机数生成器和伪随机数生成器。真随机数生成器则是使用硬件,通过收集周围环境的“噪声”,比如量子现象、光电效应、热力学噪声等等,由于这些噪声都完全无法预测,产生的随机数也就是真正意义上的随机。而计算机生的随机数生成器一般都是伪随机数生成器,系统将各种变量、算法当做这个 seed,模拟得到随机数。最常见的就是使用时间戳作为 seed,可以保证每次得到的随机数都不一样。