跳转至

随机数

随机性: 1. 分布均匀性:序列中分布应该是均匀的。 2. 独立性:任何子序列不能由其他子序列推导出。 3. 目前没有很好的办法判断一个序列的独立性好,但有很多测试可以证明一个序列不具有独立性。

伪随机数发生器(PRNG)

使用一个固定值作为种子输入,用一个确定算法产生输出序列。输出位流仅由输入值决定,可以重现这个流。
要求: 1. 均匀性:出现的0和1数量大约相等。 2. 可伸缩性:任何子序列也是随机的。 3. 一致性:初始值相同的序列相同。 4. 不可预测性: 1. 前向不可预测:不知道种子,无论知道序列中前面多少位欧无法预测序列中的下一位。 2. 后向不可预测:从产生的任何值无法推测出种子值。 伪随机函数(PRF):和PRNG的区别是长度不同,PRF产生固定长度的伪随机串。

线性同余发生器

该算法一共有4个参数: $$ m 模 \ a 乘数\ c 增量\ X_0 初始值或种子 $$ 那么随机数序列\{X_n\}就是X_{n+1}=(aX_n+c)\mod m
对a,c,m的选择至关重要,否则产生的序列不符合随机数要求。m应该很大,接近或等于2^31,一般来说要使用一个素数,这样就在一个周期内产生所有(m-1)个不重复的数字,2^{32}-1就是一个常用的素数。常用的参数是a=7^5=16807,c=0
缺点:只要知道是用了线性同余算法,那么根据4个随机数X_0,X_1,X_2,X_3联立方程即可解出a,c,m,这时就可以求得后续的序列了。因此需要使用额外的手段进行修正。

BBS发生器

选取两个大素数p和q,满足p\equiv q \equiv 3(\mod 4),即模4同余3,然后令n=q \times q,选取一个随机数s,与n互素,使用以下算法产生B_i序列: $$ X_0=s^2 \mod n \ for i=1 \to \infty \ \qquad \qquad\qquad x_i=(X_{i-1})^2 \mod n \ \qquad \qquad B_i=X_i \mod 2 $$ 这个算法是安全的,基于对n因子分解的困难性上。

使用分组密码构造伪随机数发生器

真随机数发生器(TRNG)

使用系统噪声作为随时源:键盘敲击时间,磁盘活动,鼠标移动,系统时间等,进行额外处理消除随机元中的不平衡。


评论