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

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

产生随机数的方法是先用一定的方法产生[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:99R(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>>

其实两者相差不大

用线性同余法生成伪随机数相关推荐

  1. 在VC++中生成伪随机数祥解

    摘 要 伪随机数在计算机软件设计中有很广泛的用途.本文介绍了基于数学方法的利用计算机产生伪随机数的一种方法,即线性同余法,任何伪随机数的产生都是运用递推的原理来生成的.以及在Visual C++环境中 ...

  2. 【随机数生成算法系列】线性同余法和梅森旋转法

    一般我们用到的随机算法都是伪随机算法,什么叫伪随机算法呢?伪随机算法意思是假如知道第一个随机种子和随机算法的话就可以推算出下一个随机数.通常我们程序里都是通过当前时间作为随机函数的第一个随机种子,然后 ...

  3. 蒙特卡罗方法下乘同余法生成随机数与蒲丰投针问题的实现

    蒙特卡罗方法 随机数与随机变量的生成及在数值计算中的应用 用随机(统计)模拟方法解决实际问题时,首先要解决的是随机数的产生方法,或者称随机变量的抽样方法.即如何从具有已知分布的总体中抽取简单子样,这在 ...

  4. 随机算法求pi、线性同余法求random、拉斯维加斯算法python

    一.随机算法求pi # 计算圆周率 import pdb import random def CalcPai(n):# 计算π值k = 0for i in range(0,n):x = random. ...

  5. 常用工具类 Math:数学计算 Random:生成伪随机数 SecureRandom:生成安全的随机数 2020-2-13

    常用工具类 阅读: 324836 Java的核心库提供了大量的现成的类供我们使用.本节我们介绍几个常用的工具类. Math 顾名思义,Math类就是用来进行数学计算的,它提供了大量的静态方法来便于我们 ...

  6. 生成伪随机数的函数int rand(void)和void srand(unsigned seed);

    标准库<cstdlib>(被包含于<iostream>中)提供两个帮助生成伪随机数的函数: 函数一:int rand(void): 从srand (seed)中指定的seed开 ...

  7. 线性同余法产生随机数C语言,线性同余生成随机数的一点思考

    今天下午 pk 和我讨论了一个问题,他看到在另一个项目组的 lua 代码里有一段使用线性同余产生随机数的代码,但是那个项目组的同事告诉他这个函数生成的随机数是分布不均的.于是他想到了我前两天给他讲的关 ...

  8. 加乘混合同余法生成伪随机序列【附验证】

    随机数就是随机产生的数-_-||,分为两种:真随机数(random number)和伪随机数(pseudo-random number).自然界由很多复杂因素产生的现象量化后的数(比如掷骰子)是真正随 ...

  9. random模块——生成伪随机数

    查看模块包含的全部属性和函数: __all__变量代表了该模块开放的公开接口 import random random.__all__ random.seed(a=None,version=2):指定 ...

  10. python生成伪随机数的扩展库_python模块介绍-random:生成伪随机数

    概述 这个模块实现的伪随机数生成器. 对于整数,从区间选取.对于序列,随机元素. 在实线的,有功能来计算均匀分布,正态分布(高斯) ,对数正态分布,负指数,γ和β分布.对于生成的角度分布,冯·米塞斯的 ...

最新文章

  1. UVA11462年龄排序
  2. boost::lexicographical_compare相关的测试程序
  3. Java基础 Day14 泛型
  4. python 常用包_Python常用指引
  5. Linux必懂知识大总结(下)
  6. IL应用之——用IL分析接口的本质
  7. LeetCode 1238. 循环码排列(格雷编码+旋转数组)
  8. 快速搭建实验环境:使用 Terraform 部署 Proxmox 虚拟机
  9. TensorFlow2.0(八)--tf.function函数转换
  10. Discord是什么
  11. 数据库入门-基本sql语句及数据类型
  12. netstat 查看网络连接、路由表、接口状态、端口信息
  13. Ubuntu 16.04 安装搜狗输入法
  14. 逆向记录Assaultcube for Mac OS
  15. UEBA案例分析系列之数据泄露检测
  16. 体系结构 | 五段流水线 | 流水线技术
  17. 自然数幂和伯努利数(Bernoulli)
  18. nginx 基本使用
  19. 计算机视觉的相关会议,计算机视觉相关会议
  20. Spark-core项目实战——电商用户行为数据分析

热门文章

  1. cgi一键还原 linux分区,cgi plus一键备份恢复工具
  2. kindle底层系统详细说明
  3. SIYI AK28 遥控器接收机的SBUS口与STM32通讯
  4. 华为手机序列号前三位_华为手机序列号怎么查询?
  5. 微信支付(PC扫码支付和H5公众号支付)
  6. html5 svg编辑器,HTML5 之 SVG
  7. Linux驱动开发流程
  8. KETTLE 使用教程
  9. 无线通信与编码_MATLAB实现Turbo码的仿真_含仿真代码_Dr.WuYufei
  10. 基本概念学习(8006)--南桥芯片