关于随机数生成

原文参阅:码农翻身 - 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的原理类似。

 

posted @ 2020-01-14 10:15  March On  阅读(533)  评论(0编辑  收藏  举报
top last
Welcome user from
(since 2020.6.1)