关于随机数生成
原文参阅:码农翻身 - https://mp.weixin.qq.com/s/VpYM4mP2CGLIgiadL-1SDw
以下为总结。
对生成的随机数的要求
1. 要杂乱无章
2. 不能预测,不能根据已经生成的随机数,推测出下一个随机数是啥
3. 不能重现, 无法重现和某一随机数列完全相同的数列
随机数生成方式演进
伪随机数:线性同余算法
: A、C、M是精心挑选的整数。C是所谓的“种子”seed
大多数语言中的随机数函数,如C的srand/rand、Java中的Random均为此的实现;
是伪随机数,因为可预测:知道当前随机数可以知道下一随机数;可复现:seed一样则可生成两个完全一样的随机数数列。
真随机数
使用hash函数
R1 = hash(seed) seed = seed + 1 R2 = hash(seed) seed = seed + 1 R3 = hash(seed) seed = seed + 1 R4 = hash(seed) ......
/dev/random
将机器运行的环境噪音(用户敲击键盘速度、鼠标移动、网卡发送数据量、硬盘写入数据等)收集起来放到特殊文件/dev/random 中,这些噪声数据作为随机数发生器,对其中的部分数据经Hash后得到随机数。故生成的数杂乱无章,无法预测,无法重现,为真随机数。
CPU RdRand指令
CPU利用电阻的热噪声生成真随机数,与/dev/random的原理类似。