1. 伪随机序列生成算法
真正的随机数符合正态分布且其生成不能重现。但如果一个随机数能够被重现的几率很小,由此可以认为其为伪随机数。常见的伪随机序列生成算法主要有:
1.1 线性同余发生器
随机数序列产生公式为:
$$
X_{n+1}=(aX_n + c)mod\;m\qquad 其中,m,a,c,X_0\,\in \mathbb{Z}
$$
参数取值需要满足三个标准:函数在重复前应该产生0-m之间的所有数;产生的序列应该显得随机;生成函数可以用计算机方便地实现。
满足条件的参数选择如下:
-
m一般取素数,且要求很大,对于32位机一般取值为2^{31}-1;
-
a的可取值不多,当a=7^5 = 16807时满足以上标准。
该算法的缺点是,在参数确定后,伪随机序列只与X_0有关,容易被破解,有一种改进的办法就是每隔N个数就以时钟值对m取模作为新的种子来产生新的序列;还有一种方法就是直接将随机数加上时钟值再对m取模。
使用matlab仿真模拟此算法:
function [x,u] = linear_mod_random(a, c, m, x0, iterMax) x = []; u = []; x(1) = x0; u(1) = x(1) / m; for i = 2 : iterMax x(i) = a * x(i-1) + c; x(i) = mod(x(i), m); u(i) = x(i) / m; end hold on; subplot(1,2,1); plot(x(2:end), '*-'); sTitle = sprintf('线性同余随机数发生器 (a=%d, c=%d, m=%d, x0=%d)', a, c, m, x0); title(sTitle); subplot(1,2,2); histogram(u(2:end)); title('随机数直方图分布'); hold off; end
产生20个随机数的结果:
结果表明,本伪随机数生成器生成的序列符合均匀性与随机统计特性。
1.2 BBS发生器
产生过程如下:
首先,选择两个大素数p和q,且要求p\equiv q\equiv 3(mod \,4),令n=p*q,接着选择一个随机数s,要求s与n互素,然后按照以下算法产生位B_i序列:
X_0 =s^2\;mod \;n
for \; i=0\;to\,\infty
X_i=(X_{i -1})^2\,mod \,n
B_i=X_i\,mod\;2
BBS发生器是产生安全伪随机数的普遍算法,是特意构造算法中密码强度有最强公开证明的一个,被称为密码安全伪随机数发生器。
BBS的安全性是基于对n的因子分解困难性上的(大整数难分解问题)。
matlab实现BBS伪随机序列生成器核心代码:
function [x,b] = BBS(p,q,s,iterMax) x = []; b = []; n = p *