用线性同余法生成伪随机数

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。用线性同余法生成伪随机数,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

用线性同余法生成伪随机数

在计算机上可以用物理方法来产生随机数,但价格昂贵,不能重复,使用不便。另一种方法是用数学递推公式产生,这样产生的序列与真正的随机数序列不同,所以称为伪随机数或伪随机序列,只要方法和参数选择合适,所产生的伪随机数就能满足均匀性和独立性,与真正的随机数具有相近的性质。

产生随机数的方法是先用一定的方法产生[0,1]均匀分布的随机数,然后通过一个适当的变换就可以得到符合某一概率模型的随机数。

原理:假设我们要生成伪随机数列为R0、R1、R2…。首先,我们根据伪随机数的种子,用下列公式计算第一个伪随机数R0
R0=(A*种子+C)mod M
接下来用R0生成R1,R1生成R2,递归即可

当a=0时为和同余法,当c=0时为乘同余法,c≠0时为混合同余法

常用的产生[0,1]均匀分布的随机数的方法有乘同余法和混合同余法。

简而言之,线性同余法就是将当前的伪随机数值乘以A再加上C,然后将除以M得到的余数作为下一个伪随机数。在线性同余法中,最近一次生成的伪随机数的值就是内部状态,伪随机数的种子被用来对内部状态进行初始化。

在线性同余法中,只要谨慎选择A、C、M的值,就能够很容易地生成具备随机性的伪随机数列。

由于伪随机数是除以M得到的余数,因此其范围必定是0~M-1,而且生成的随机数会呈现一定周期(打个比方,x mod 12 代表的是钟表刻度,它的值永远在0-11之间,这个概念在数学里叫”同余”)。而且根据A、C、M的值,最终只能生成上述范围中的一部分值(因此周期会缩短)。

线性同余法的最大周期是m,但一般情况下会小于m。要使周期达到最大,应该满足以下条件:
(1) c和m互质;
(2) m的所有质因子的积能整除a-1;
(3) 若m是4的倍数,则a-1也是;
(4) a,c,r0(初值,一般即种子)都比m小;
(5) a,c是正整数。

线性同余方法速度快,如果对乘数和模数进行适当的选择,可以满足用于评价一个随机数产生器的3 种准则:
(1)这个函数应该是一个完整周期的产生函数。也就是说,这个函数应该在重复之前产生出0 到m之间的所有数;
(2)产生的序列应该看起来是随机的;
(3)这个函数应该用32bit 算术高效实现。

使用混合同余法
Ri+1=(a*Ri+c)mod(m)
Yi+1=Ri+1/m
在matlab中自己选取a,c,m与其内置函数rand比较:

function A = fakerand( a,c,m,r0 )
A=zeros(100,1);
R=zeros(100,1);
R(1)=mod((a*r0+c),m);
A(1)=R(1)/m;
for i=1:99
    R(i+1)=mod((a*R(i)+c),m);
    A(i+1)=R(i+1)/m;
end

mean(A)

ans =

    0.5345
var(A)

ans =

    0.0768

使用MATLAB内置函数rand:

 mean(A)

ans =

    0.4940

>> var(A)

ans =

    0.0835

>> 

其实两者相差不大

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153887.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!