即使普通家用计算机也是可以生成真随机数的,只不过一般情况下没必要用罢了。
随机性从低到高:
- 一般编程语言的库函数使用伪随机数算法,比如C中的rand()。这种随机数你只要知道初始值和算法,就能迭代出来,是伪随机数。
- 类Unix系统中有两个虚拟随机硬件/dev/random和/dev/urandom。Linux的/dev/random和/dev/urandom生成的随机数依赖操作系统中的硬件噪声,比如网络数据、鼠标位置、键盘输入等,这些信息不可预测,可以认为是真随机数(当然你要是能记录下计算机系统内每时每刻的全部状态还是能确定这个数的)。区别在于读取时如果熵池不够大,会不会阻塞等待采集噪声,urandom因为不阻塞所以可能熵池不大,随机性不够。FreeBSD的/dev/random和/dev/urandom就只是一个简单的伪随机数发生器,靠Yarrow算法实现。
- Intel在Ivy Bridge架构之后的处理器支持RDRAND指令,该指令会根据CPU的热噪声和时间中断做为种子生成随机数。根据我们现有的物理学,这个种子根本无法确定,生成的是真真正正的随机数。