用乘同余法产生随机数

合集下载

线性乘同余方法

线性乘同余方法
2.3 线性乘同余方法(Linear Congruential Method) 1948年由Lehmer提出的一种产生伪随机数的方法,是最常用的方 法。 1、递推公式:
I n1 (aIn c) modm
其中: I0: 初始值(种子seed) a: 乘法器 (multiplier) c: 增值(additive constant) m: 模数(modulus) mod:取模运算:(aIn+c)除以m后的余数
2.3 线性乘同余方法(Linear Congruential Method)
RANDU随机数产生器:
1961年由IBM提出
I n1 (65539 I n ) mod231
unsigned long seed = 9; float randu() { const unsigned long a = 65539; const unsigned long m = pow(2,31); unsigned long i1; i1 = (a * seed) % m; seed = i1; return (float) i1/float(m);
5、乘数因子a的选择: 1961年,M. Greenberger证明:用线性乘同余方法产生的随机 数序列具有周期m的条件是: 1. c和m为互质数; 2. a-1是质数p的倍数,其中p是a-1和m的共约数; 3. 如果m是4的倍数,a-1也是4的倍数。 例:a=5,c=1,m=16,I0=1 周期=m=16 1,6,15,12,13,2,11,8,9,14,7,4,5,10,3,0,1,6,15, 12,13,2,..
2.3 线性乘同余方法(Linear Congruential Method) for(int i=0; i < 10000; i++) { float x = randu(); float y = randu(); float z = randu(); h1->Fill(x); h2->Fill(x,y); h3->Fill(x,y,z); } pad1->cd(); h1->Draw(); pad2->cd(); h2->Draw(); pad3->cd(); h3->Draw(); }

随机数的生成方法

随机数的生成方法

在一定的统计意义下可作为随机样本 X1,X2,…,Xn 的一组样本值,称r1 , r2 , … , rn一组具有与X相 同分布的随机数. 例1 设随机变量X~B(1, 0.5), 模拟该随机变 量X的一组样本值. 一种简单的方法是 抛一枚均匀硬币,观察出现正反面的情况, 出现正面记为数值“1”,否则记为“0”得: 0,0,1,0,1,1,1,0,1,0,0,0, 0,1,1,0,1,0, … 可看成总体X 的一系列样本值,或称产生了 一系列具有两点分布的随机数.
} { X xn }

P{ X xn } pn ,
(n 1,2,)
产生X的随机数的算法步骤 : (1) 产生一个(0, 1)区间上均匀分布随机数r(RND);
(2) 若 P(n-1)<r≤P(n) ,则令X 取值为xn. 例3 离散型随机变量X的分布律如下 X=x 0 P(x) 0.3 1 0.3 2 0.4
数学软件有产生常用分布随机数的功能
需要数据 量很大时 不太有效 需要寻求一种简便、经济、可靠, 并能在 计算机上实现的产生随机数的方法.
对特殊分布
二.均匀分布随机数的产生 最常用、最基础的随 机数是在(0,1)区间 内均匀分布的随机数 (简记为RND)
理解为:随机 变量X~U(0,1) 的一组样本值 的模拟值
2. 数列{rn}本质上是实数列, 给定初始值由递推 公式计算出的一串确定的数列.
从计算机中直接调用 某种分布的随机数同样存 在类似问题.
解决方法与思路: 1. 选择模拟参数 2. 对数列进行统计检验
不能简单 等同于真 正意义的 随机数.
1. 选择模拟参数 1) 周期的长度取决于参数x0, 入, M的选择; 2) 通过适当选取参数可以改善随机数的统计 性质. 几组供参考的参数值: x。=1,λ=7,M=1010 (L=5×107)

迭代取中法、乘同余法及混合同余法产生随机数方法

迭代取中法、乘同余法及混合同余法产生随机数方法

迭代取中法、乘同余法及混合同余法产生随机数方法在用计算机编制程序时,经常需要用到随机数,尤其在仿真等领域,更对随机数的产生提出了较高的要求,仅仅使用 C 语言类库中的随机函数已难以胜任相应的工作。

现实中,用投色子计数的方法产生真正的随机数,但电脑若也这样做,将会占用大量内存;虽然用噪声发生器或放射性物质也可产生真正的随机数,但操作不可重复。

而用数学方法产生随机数则最适合计算机,这就是周期有限,易重复的“伪随机数”。

(注:这里生成的随机数所处的分布为0-1 区间上的均匀分布。

不是0-1 区间怎么办?除以(high-low), 再加上low 就可以完成任务。

我们需要的随机数序列应具有非退化性,周期长,相关系数小等优点。

)1、迭代取中法:这里在迭代取中法中介绍平方取中法, 其迭代式如下:Xn+1=(Xn^2/10^s)(mod 10^2s)Rn+1=Xn+1/10^2s其中,Xn+1是迭代算子,而Rn+1 则是每次需要产生的随机数。

第一个式子表示的是将Xn 平方后右移s 位,并截右端的2s 位。

而第二个式子则是将截尾后的数字再压缩2s 倍,显然:0=<Rn+1<=1。

迭代取中法有一个显著的不良特性就是它比较容易退化成0。

实现代码(C语言):#include <stdio.h>#include <math.h>#define S 2float Xn=12345; //Seed & Iterfloat Rn; //Return Valvoid InitSeed(float inX0){Xn=inX0;}float MyRnd(){//implementation: Xn+1=(Xn^2/10^S)(mod 10^2S)Xn=(int)fmod((Xn*Xn/pow(10,S)),pow(10,2*S));//here can's use %//implementation: Rn+1=Xn+1/10^2SRn=Xn/pow(10,2*S);return Rn;}/*测试主程序,注意,本文只列举一次测试主程序,以下不再重复*/int main(){int i;FILE * debugFile;if((debugFile=fopen("outputData.txt","w"))==NULL){fprintf(stderr,"open file error!");return -1;}printf("\n");for(i=0;i<100;i++){tempRnd=MyRnd();fprintf(stdout,"%f ",tempRnd);fprintf(debugFile,"%f ",tempRnd);}getchar();return 0;}前一百个测试生成的随机数序列(明显可见其容易退化为0):0.399000 0.920100 0.658400 0.349000 0.180100 0.243600 0.934000 0.235600 0.550700 0.327000 0.692900 0.011000 0.012100 0.014600 0.021300 0.045300 0.205200 0.210700 0.439400 0.307200 0.437100 0.105600 0.115100 0.324800 0.549500 0.195000 0.802500 0.400600 0.048000 0.230400 0.308400 0.511000 0.112100 0.256600 0.584300 0.140600 0.976800 0.413800 0.123000 0.512900 0.306600 0.400300 0.024000 0.057600 0.331700 0.002400 0.000500 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0000002、乘同余法:乘同余法的迭代式如下:Xn+1=Lamda*Xn(mod M)Rn+1=Xn/M当然,这里的参数选取是有一定理论基础的,否则所产生的随机数的周期将较小,相关性会较大。

随机数的算法分析

随机数的算法分析

随机数的算法分析随机数的算法分析1-0:Microsoft VC++产生随机数的原理:Srand ( )和Rand( )函数。

它本质上是利用线性同余法,y=ax+b(mod m)。

其中a,b,m 都是常数。

因此rand的产生决定于x,x被称为Seed。

Seed需要程序中设定,一般情况下取系统时间作为种子。

它产生的随机数之间的相关性很小,取值范围是0—32767(int),即双字节(16位数),若用unsigned int 双字节是65535,四字节是4294967295,一般可以满足要求。

1-1:线性同余法:/P>其中M是模数,A是乘数,C是增量,为初始值,当C=0时,称此算法为乘同余法;若C ≠0,则称算法为混合同余法,当C取不为零的适当数值时,有一些优点,但优点并不突出,故常取C=0。

模M大小是发生器周期长短的主要标志,常见有M为素数,取A为M的原根,则周期T=M-1。

例如:a=1220703125a=32719 (程序中用此组数)a=16807代码:void main( ){const int n=100;double a=32719,m=1,f[n+1],g[n],seed;m=pow(2,31);cout<<"设置m值为"<<m-1<<endl;< p="">cout<<"输入种子"<<="">cin>>seed;f[0]=seed;for(int i=1;i<=n;i++) //线性同余法生成随机数{f[i]=fmod((a*f[i-1]),(m-1));g[i-1]=f[i]/(m-1);cout.setf(ios::fixed);cout.precision(6); //设置输出精度cout<<i<<" "<<'\t'<<g[i-1]<<endl;<="" p="">}}结果分析:统计数据的平均值为:0.485653统计数据的方差为:0.3205761-2:人字映射递推公式/P>就是有名的混沌映射中的“人字映射”或称“帐篷映射”,它的非周期轨道点的分布密度函数:人字映射与线性同余法结合,可产生统计性质优良的均匀随机数。

乘同余法的原理和应用

乘同余法的原理和应用

乘同余法的原理和应用1. 原理介绍乘同余法是一种常用的随机数生成方法,在计算机科学中有广泛的应用。

它基于数论中的同余关系,通过逐步选择合适的参数,生成符合一定分布特性的随机数序列。

2. 原理步骤乘同余法的原理分为以下几个步骤:2.1 选择合适的参数乘同余法需要选择两个参数:模数(modulus)和乘数(multiplier)。

模数一般选择一个较大的素数,而乘数则选择与模数相对较小但与之互质的数。

2.2 初始化随机种子在生成随机数序列之前,需要先通过一个种子值初始化随机数发生器。

种子值可以是任意非负整数。

2.3 应用同余关系计算随机数通过使用同余关系,根据上一个随机数计算下一个随机数。

具体的计算公式为:X_{n+1} = (a * X_n + c) mod m其中,X_n为当前随机数,a为乘数,c为增量,m为模数。

这样就可以生成一个随机数序列。

2.4 生成随机数根据上述公式,不断重复步骤2.3,可以生成一系列满足均匀分布的随机数。

3. 应用场景乘同余法由于其简单性和良好的分布特性,在实际应用中被广泛采用。

以下是一些常见的应用场景:3.1 模拟实验在模拟实验中,需要生成大量的随机数来模拟现实情况。

乘同余法可以用来生成符合一定分布特性的输入数据,从而进行模拟实验并得出结果。

3.2 加密算法在密码学中,随机数生成是很重要的一环。

乘同余法可以用来生成密钥、初始化向量等随机数,从而增加密码算法的安全性。

3.3 游戏开发在游戏开发中,需要生成随机数来产生不同的游戏场景、怪物属性等。

乘同余法可以用来生成伪随机数,使得游戏具有一定的随机性和不确定性。

3.4 模拟退火算法模拟退火算法是一种全局优化算法,需要生成随机数来进行搜索过程。

乘同余法可以用来生成初始解的随机数,从而增加搜索过程的随机性,提高算法的效果。

4. 注意事项在使用乘同余法时,需要注意以下几点:•选择合适的参数是关键,不同的参数选择会导致不同的随机数序列。

乘同余法的原理和应用

乘同余法的原理和应用

乘同余法的原理和应用乘同余法是一种常用于随机数生成的方法,它是通过连续地取余操作来获得一系列随机数的一种技术。

乘同余法的原理很简单,基本思想是从一个种子值开始,用一个较大的乘数乘以种子值,然后取结果的低位数作为下一个种子值,再次用同样的乘数乘以新的种子值,这个过程不断重复。

在取余操作前,可以选择先加上一个固定的偏移量,以增加随机性。

Xn+1 = (a * Xn + c) mod m其中,Xn表示第n个随机数,a为乘数,c为偏移量,m为模数。

这个公式的含义是将上一个随机数与乘数相乘、再加上偏移量,取余之后得到新的随机数。

通过不断反复执行这个公式,可以生成一系列满足特定均匀分布的随机数。

1.随机数生成:乘同余法可以用来生成一系列满足均匀分布的随机数。

通过选取不同的乘数和偏移量,可以产生不同范围或不同长度的随机数。

2.加密算法:乘同余法可以用于加密算法中的伪随机数生成器。

在加密算法中,随机数的质量和随机性非常重要,乘同余法可以提供足够的随机性。

3.模拟实验:在模拟实验中,需要生成满足特定概率分布的随机数,乘同余法可以用于生成满足均匀分布的随机数,然后通过一些变换或转换,得到满足其他分布的随机数。

4.游戏开发:在游戏开发中,需要生成随机的游戏元素或随机事件,乘同余法可以用于生成伪随机数,从而实现游戏的随机性。

虽然乘同余法具有简单易实现的优点,但是它也存在一些问题。

首先,乘同余法生成的随机数序列可能会出现周期性,即会在一定周期内重复出现相同的随机数。

其次,乘同余法生成的随机数序列可能会出现重复性,即会在一定次数内重复出现相同的随机数。

另外,乘同余法的随机数序列可能并不是真正的随机序列,它们可能呈现一定的规律或周期性。

为了解决这些问题,可以选择合适的乘数、偏移量和模数,通过不断尝试和优化,选择适合具体应用场景的乘同余法参数。

此外,也可以采用其他更复杂、更安全的随机数生成算法,如线性同余法、梅森旋转算法等。

总之,乘同余法是一种常用的随机数生成方法,它通过连续的乘法和取余操作,生成一系列满足均匀分布的随机数。

matlab乘同余生成随机数

matlab乘同余生成随机数

matlab乘同余生成随机数Matlab的乘同余算法是一种简单而常用的伪随机数生成方法,它可以生成在给定区间内均匀分布的随机数。

本文将介绍该算法的原理和使用方法。

1. 原理:乘同余算法基于一个简单的迭代公式,其中包含一个乘法和一个取模运算。

具体而言,它使用一个初始种子值x0,并根据以下公式生成下一个随机数x1,x2,...:```x_i+1 = (a * x_i + c) mod m```其中,a,c,和m是常数。

生成的随机数为x_i / m,通常情况下,这些常数需要精心选择以保证生成的随机数具有足够的随机性和均匀分布性。

2. 使用方法:在Matlab中,可以使用`rand()`函数来生成基于乘同余算法的随机数。

这个函数没有参数,每次调用都会生成一个[0, 1)范围内的随机数。

具体使用方法如下:```x = rand()```如果需要生成具有特定范围的随机数,例如[1, 100]之间的整数,可以使用以下代码:```x = randi([1, 100])```其中,'randi'函数用于生成整数随机数,'[1, 100]'参数指定了随机数范围。

3. 注意事项:- 乘同余算法本质上是一种伪随机数生成方法,即生成的随机数序列是确定的,并非真正的随机数。

这是因为在算法中使用了固定的公式和初始种子值。

- 在使用乘同余算法时,需要注意选择合适的常数。

常数的选择很关键,不同的常数会导致生成的随机数具有不同的性质。

如果常数选择不当,可能会导致生成的随机数不够随机或不均匀。

- 对于一些特定的应用场景,乘同余算法可能不适用。

例如,需要高度安全性的密码学应用,应该选择更为复杂和安全的随机数生成方法。

总结起来,Matlab中的乘同余算法是一种简单而常用的伪随机数生成方法,可以生成在给定区间内均匀分布的随机数。

使用该算法时,需要注意选择合适的常数,以确保生成的随机数具有足够的随机性和均匀分布性。

利用混合乘同余法产生(0,1)均匀分布随机数

利用混合乘同余法产生(0,1)均匀分布随机数

i
* 为非负整数。
0
xi
M
可以证明,{i}是周期为 2k 的伪随机数。
x*
1、混合同余法(0,1)均匀分布的随机数 L=60,取 k=2,c=1,n=5,l=60, 0 =1
公lear clc k=8;
c=1; n=5; x=1;
M=2^k;
A=2^n+1; store=[ ]; for i=1:60
0.128906250000000 0.890625000000000 0.777343750000000 0.789062500000000 0.925781250000000 0.187500000000000 0.574218750000000 0.0859375000000000 0.722656250000000 0.484375000000000
x1=xor(y3,y4);%第一个移位积存器的输入是第3个与第4个移位积存器的输出的“或” x2=y1;%第二个移位积存器的输入是第3个移位积存器的输出 x3=y2;%第三个移位积存器的输入是第2个移位积存器的输出 x4=y3;%第四个移位积存器的输入是第3个移位积存器的输出 y(i)=y4;%取出第四个移位积存器幅值为"0"和"1"的输出信号,
0.359375000000000 0.863281250000000 0.492187500000000
0.246093750000000 0.257812500000000 0.394531250000000 0.656250000000000 0.0429687500000000 0.554687500000000 0.191406250000000 0.953125000000000 0.839843750000000 0.851562500000000

fortran产生随机数方法介绍

fortran产生随机数方法介绍

fortran产生随机数方法介绍(附代码)注意:现在计算机产生的随机数都是伪随机数。

1.0-1之间均匀分布的随机数random_number(x) 产生一个0到1之间的随机数(x可以是向量),但是每次总是那几个数。

用了random_seed ()后,系统根据日期和时间随机地提供种子,使得随机数更随机了。

program randomimplicit nonereal :: xcall random_seed () ! 系统根据日期和时间随机地提供种子call random_number (x) ! 每次的随机数就都不一样了write(*,*) xstopend program random2.任意区间均匀分布的随机数function my_random (lbound,ubound)implicit nonereal :: lbound,uboundreal :: lenreal :: my_randomreal :: tlen=ubound-lbound !计算范围大小call random_number(t) !t是0-1之间的随机数my_random=lbound+len*treturnend注意:在循环外call random_seed()3.产生一个随机数数组,只需加一个循环即可function my_random (lbound,ubound)implicit nonereal :: lbound,uboundreal :: leninteger sizereal :: my_random(size) !size代表数组元素的个数real :: tinteger ilen=ubound-lbound !计算范围大小do i=1,10call random_number(t) !t是0-1之间的随机数my_random(i)=lbound+len*t !把t转换成lbound-ubound间的随机数end doreturnend注意:同理在循环外call random_seed()4.标准正态分布随机数/高斯分布随机数(1)徐士良的那本程序集里介绍了正态分布随机数产生的原理,不过他的方法只能产生较为简单的随机数,随机数的质量并不高,特别是随机数的数目较多时。

随机数产生原理及应用

随机数产生原理及应用
得 Fi=G(R)=2*PI*R ,其中,R 为 0-1 区间上的均匀分布的随机数. 程序略
试验结果:
图 5:用反函数法生成的 300 随机数的平均分布情况 由于这里相当对 0-1 上的分布进行线性变换,所以变换后仍呈均匀分布是显 然的。 3.1.2 指数分布: 指数分布的分布函数为: x<0 时,F(x)=0 ; x>=0,F(x)=1-exp(-lamda*x) 利用反函数法,可以求得: x=-lnR/lamda 试验结果:
容易看出其易退化成 0 的缺点.
2.2 乘同余法: 乘同余法的迭代式如下: Xn+1=Lamda*Xn(mod M) Rn+1=Xn/M 各参数意义及各步的作用可参 2.1 当然,这里的参数的选取是有一定的理论基础的,否则所产生的随机数的周 期将较小,相关性会较大。 经过前人检验的两组性能较好的素数取模乘同余法迭代式的系数为: 1) lamda=5^5,M=2^35-31 2) lamda=7^5,M=2^31-1 相应 C 程序关键代码段: double long M;//请注意,这里一定要用到 double long,否则计算 2^32 会溢 出 float MyRnd() {
2.3 混合同余法: 混合同余法是加同余法和乘同余法的混合形式,其迭代式如下: Xn+1=(Lamda*Xn+Miu)%M Rn+1=Xn/M 经前人研究表明,在 M=2^q 的条件下,参数 lamda,miu,X0 按如下选取,周 期较大,概率统计特性好: Lamda=2^c+1,c 取 q/2 附近的数 Miu=(1/2+sqrt(3))/M X0 为任意非负整数
mPoint.x=miu1+sigma1*x; mPoint.y=miu2+sigma2*x;

随机数的方法

随机数的方法

随机数的方法随机数是计算机领域中常用的一种方法,用于产生一组随机的数值。

在一些需要随机性的计算中,比如密码学、概率统计、物理模拟等,随机数的作用不可忽视。

下面将介绍几种常用的随机数产生方法。

一、线性同余法线性同余法是最简单、最基础的随机数产生算法。

它的计算原理是利用某个数不断地乘以一个常数并加上另一个常数,然后对一个大数取余数,得到的余数就是一个伪随机数。

该算法的公式为:X(n+1) = (aX(n)+c) mod m其中,X(n)为第n个随机数,a、c、m为常数。

为了避免过多的线性相关性,常数的选择至关重要。

二、拉斐特——罗森费尔德算法拉斐特——罗森费尔德算法又称真随机数发生器,它是一种基于物理过程的随机数生成方法。

它的原理是利用光电效应或微波辐射产生的电信号的微小变化,作为随机因素,产生随机数。

该算法生成的随机数既真实又不可预测,但是需要一些特殊的硬件设备才能实现。

三、梅森旋转算法梅森旋转算法是一种用于产生高质量随机数的算法。

它的原理是利用一个大型的循环移位寄存器,每次进行大量的移位运算以增加随机性。

该算法的随机性非常好,并且产生的随机数周期很长,但是它需要更多的时间和计算资源来实现。

四、高斯分布高斯分布是一种常见的概率分布,也是一种常用的随机数生成方法。

它的原理是根据正态分布函数的概率密度函数来产生符合该函数的随机数。

通过该方法生成的随机数呈现出逼近正态分布的性质,适用于需要模拟实际情况的概率统计问题。

总之,随机数发生算法有很多种,我们需要根据实际需要选择合适的算法。

在实际应用中,需要考虑到随机数的质量、随机性、周期性等方面问题。

线性同余法产生随机数的递推公式

线性同余法产生随机数的递推公式

线性同余法产生随机数的递推公式1. 用“线性同余法”产生随机数,公式如下: x=(x*29+37) mod 10002. 同余的概念是这样描述的:3. 设m是一个给定的正整数,如果两个整数a,b用m除,所得的余数相同,则称a,b对模m同余。

4. 所谓线性同余法(又叫混合同余法),就是这样的一个公式:X[i+1]=(A*X[i]+C) mod M;5. 经前人研究表明,在M=2^q的条件下,参数A,C,X[0]按如下选取,周期较大,概率统计特性好:6. A=2^b+1=2^(log2(M)/2)+1=2^log2(sqrt(M))+1=sqrt(M)+1;b取q/2 附近的数7. C=(1/2+sqrt(3))*M8. X[0]为任意非负数9. M ,模数0 < MA,乘数0 <= A<MC,增量0 <=C<MXi,开始值0<=Xi<M10. 它的一个致命的弱点,那就是随机数的生成在某一周期内成线性增长的趋势,显然,在大多数场合,这种极富“规律”型的随机数是不应当使用的。

11.12. 同余序列总是进入一个循环,这是一个事实,它最终必定在N个数之间无休止的重复循环。

使用该方法产生的伪随机数能不能近似真正的随机效果,跟四个整数的设置相关:1. 序列的开始值,一般取正整数。

2. m:一个同余序列的周期不可能多于m个元素,所以,为了达到预期的随机效果,一般我们希望这个值稍稍大一点。

在大多数情况下,当m = 2e(e表示计算机的字大小)时,在计算机中得到的随机效果就比较令人满意了。

而且这样对于随机数生成速度也是比较合理的。

3. a:当a=1的时候,Xn=(X0+nc)mod m ,它不具有随机序列的特性;而当a=0的时候甚至更糟糕。

因此,为实用起见,选择2 <=a<m比较合理。

4. c:当c=0时,数的生成过程比c!=0的时候要稍微快些,它的限制缩短了这个序列的周期长度,但是也仍然有可能得到一个相当长的周期。

一维均匀分布随机数序列的产生方法

一维均匀分布随机数序列的产生方法

一维均匀分布随机数序列的产生方法引言:随机数序列主要应用于序列密码(流密码)。

序列密码的强度完全依赖于序列的随机性与不可预测性。

随机数在密码学中也是非常重要的,主要应用于数字签名(如美国数字签名标准中的数字签名算法)、消息认证码(如初始向量)、加密算法(如密钥)、零知识证明、身份认证(如一次性nonce)和众多的密码学协议。

关键词:随机数、随机数序列、均匀分布一、随机数及随机数序列的简介在统计学的不同技术中需要使用随机数,比如在从统计总体中抽取有代表性的样本的时候,或者在将实验动物分配到不同的试验组的过程中,或者在进行蒙特卡罗模拟法计算的时候等等。

产生随机数有多种不同的方法。

这些方法被称为随机数发生器。

随机数最重要的特性是:它所产生的后面的那个数与前面的那个数毫无关系。

随机数序列分为真随机数序列与伪随机数序列,随机数分为真随机数和伪随机数。

真随机数序列从真实世界的自然随机性源产生,办法是找出似乎是随机的事件然后从中提取随机性,如自然界中的抛币。

在计算机中噪音可以选取真实世界的自然随机性,如从计算机时钟寄存器中取得本机的当前系统时间到秒(或微秒)级的数值,测量两次击键的时间间隔,相邻两次鼠标移动的时间间隔以及由计算机硬件报告的鼠标实际位置等。

伪随机数序列用确定的算法产生,不是真正的随机数序列。

伪随机数序列发生器指使用短的真随机数序列(称为种子)x扩展成较长的伪随机数序列y。

在密码学中伪随机数序列的使用大大减少了真随机数序列的使用,但不能完全取代真随机数序列的使用(如种子)。

通常,我们需要的随机数序列应具有非退化性、周期长、相关系数小等优点。

二、一维均匀分布的简介设连续型随机变量X 的分布函数为 F(x)=(x-a)/(b-a),a ≤x≤b,则称随机变量X 服从[a,b]上的均匀分布,记为X ~U[a ,b]。

若[x1,x2]是[a,b]的任一子区间,则 P{x1≤x≤x2}=(x2-x1)/(b-a),这表明X 落在[a,b]的子区间内的概率只与子区间长度有关,而与子区间位置无关,因此X 落在[a,b]的长度相等的子区间内的可能性是相等的,所谓的均匀指的就是这种等可能性。

2022年秋季-福师《数学建模》在线作业二-[复习资料]-答案3

2022年秋季-福师《数学建模》在线作业二-[复习资料]-答案3

2022年秋季-福师《数学建模》在线作业二-0003
试卷总分:100 得分:100
一、判断题 (共 40 道试题,共 80 分)
1.最小二乘法估计是常见的回归模型参数估计方法
<-A.->错误
<-B.->正确
【正确答案】:B
2.样本平均值和理论均值不属于参数检验方法
<-A.->错误
<-B.->正确
【正确答案】:A
3.量纲齐次原则指任一个有意义的方程必定是量纲一致的<-A.->错误
<-B.->正确
【正确答案】:B
4.对实际问题建模没有确定的模式
<-A.->错误
<-B.->正确
【正确答案】:B
5.数学建模以模仿为目标
<-A.->错误
<-B.->正确
【正确答案】:A
6.利用乘同余法可以产生随机数
<-A.->错误
<-B.->正确
【正确答案】:B
7.大学生走向工作岗位后就不需要数学建模了
<-A.->错误
<-B.->正确
【正确答案】:A。

fortran产生随机数方法介绍

fortran产生随机数方法介绍

fortran产生随机数方法介绍(附代码)注意:现在计算机产生的随机数都是伪随机数。

1.0-1之间均匀分布的随机数random_number(x) 产生一个0到1之间的随机数(x可以是向量),但是每次总是那几个数。

用了random_seed ()后,系统根据日期和时间随机地提供种子,使得随机数更随机了。

program randomimplicit nonereal :: xcall random_seed () ! 系统根据日期和时间随机地提供种子call random_number (x) ! 每次的随机数就都不一样了write(*,*) xstopend program random2.任意区间均匀分布的随机数function my_random (lbound,ubound)implicit nonereal :: lbound,uboundreal :: lenreal :: my_randomreal :: tlen=ubound-lbound !计算范围大小call random_number(t) !t是0-1之间的随机数my_random=lbound+len*treturnend注意:在循环外call random_seed()3.产生一个随机数数组,只需加一个循环即可function my_random (lbound,ubound)implicit nonereal :: lbound,uboundreal :: leninteger sizereal :: my_random(size) !size代表数组元素的个数real :: tinteger ilen=ubound-lbound !计算范围大小do i=1,10call random_number(t) !t是0-1之间的随机数my_random(i)=lbound+len*t !把t转换成lbound-ubound间的随机数end doreturnend注意:同理在循环外call random_seed()4.标准正态分布随机数/高斯分布随机数(1)徐士良的那本程序集里介绍了正态分布随机数产生的原理,不过他的方法只能产生较为简单的随机数,随机数的质量并不高,特别是随机数的数目较多时。

随机数生成及各概率分布

随机数生成及各概率分布

随机数生成及各概率分布一.随机数生成及(0,1)均匀分布1.乘同余法生成随机数:乘同余法的迭代式如下:Xn+1=Lamda*Xn(mod M)Rn+1=Xn/M这里取X0=1,Lamda=7^5,M=2^31-1;利用乘同余法生成的300个(0,1)之间的随机数为(这里仅显示200个数据)0.0000 0.1315 0.7556 0.4587 0.5328 0.2190 0.0470 0.6789 0.6793 0.9347 0.3835 0.5194 0.8310 0.0346 0.0535 0.5297 0.6711 0.0077 0.3834 0.0668 0.4175 0.6868 0.5890 0.9304 0.8462 0.5269 0.0920 0.6539 0.4160 0.7012 0.9103 0.7622 0.2625 0.0475 0.7361 0.3282 0.6326 0.7564 0.9910 0.3653 0.2470 0.9826 0.7227 0.7534 0.6515 0.0727 0.6316 0.8847 0.2727 0.4364 0.7665 0.4777 0.2378 0.2749 0.3593 0.1665 0.4865 0.8977 0.9092 0.0606 0.9047 0.5045 0.5163 0.3190 0.9866 0.4940 0.2661 0.0907 0.9478 0.0737 0.5007 0.3841 0.2771 0.9138 0.5297 0.4644 0.9410 0.0501 0.7615 0.7702 0.8278 0.1254 0.0159 0.6885 0.8682 0.6295 0.7362 0.7254 0.9995 0.8886 0.2332 0.3063 0.3510 0.5133 0.5911 0.8460 0.4121 0.8415 0.2693 0.4154 0.5373 0.4679 0.2872 0.1783 0.1537 0.5717 0.8024 0.0331 0.5344 0.4985 0.9554 0.7483 0.5546 0.8907 0.6248 0.8420 0.1598 0.2128 0.7147 0.1304 0.0910 0.2746 0.0030 0.4143 0.0269 0.7098 0.9379 0.2399 0.1809 0.3175 0.8870 0.6521 0.1503 0.6813 0.3858 0.3877 0.4997 0.1475 0.5872 0.8456 0.5901 0.9554 0.5561 0.1482 0.9833 0.4088 0.1418 0.5649 0.2521 0.4885 0.4640 0.9611 0.1260 0.1998 0.3192 0.6293 0.1267 0.6513 0.6216 0.8031 0.2478 0.4764 0.3893 0.2033 0.0284 0.9017 0.4265 0.1420 0.9475 0.4103 0.1312 0.8856 0.0922 0.1622 0.0711 0.3653 0.2531 0.1351 0.7832 0.4553 0.3495 0.4523 0.8089 0.9317 0.6516 0.2152 0.6796 0.9089 0.2501 0.8609 0.4713 0.5060 0.6004 0.8176 0.7558 0.4622 0.9514 0.6327 0.4393 0.8247 2.(0,1)均匀分布数据的检验(1)通过计算得均值为()5081.0=X E ,二阶矩为()3423.02=X E ,方差为0842.02=S(2)均基本满足(0,1)均匀分布的均值()21=X E ,二阶矩为()312=X E ,方差为1212=S 所以认为该随机序列基本上符合(0,1)均匀分布。

用乘同余法产生随机数

用乘同余法产生随机数

例2.1 用乘同余法产生随机数(见光盘FLch2sjxleg1.m)①编程如下:A=6; N=100; %初始化;x0=1; M=255;for k=1:N %乘同余法递推100次;x2=A*x0; %x2和x0分别表示x i和x i-1;x1=mod (x2,M); %将x2存储器的数除以M,取余数放x1(x i)中;v1=x1/256; %将x1存储器的数除以256得到小于1的随机数放v1中;)存放在矩阵存储器v的第k列中,v(:,k) v(:,k)=v1; % 将v1中的数(i%表示行不变、列随递推循环次数变化;x0=x1; %x i-1= x i;v0=v1;end %递推100次结束;v2=v %该语句末无‘;’,实现矩阵存储器v中随机数放在v2中,%且可直接显示在MA TLAB的window中;k1=k;%grapher %以下是绘图程序;k=1:k1;plot(k,v,k,v,'r');xlabel('k'), ylabel('v');tktle('(0-1)均匀分布的随机序列')②程序运行结果如图2.5所示。

图2.5 采用MA TLAB产生的(0,1)均匀分布的随机序列图③产生的(0-1)均匀分布的随机序列在程序运行结束后,产生的(0,1)均匀分布的随机序列,直接从MATLAB的window 界面中copy出来如下(v2中每行存6个随机数):v2 =0.0234 0.1406 0.8438 0.0820 0.4922 0.96090.7852 0.7266 0.3750 0.2578 0.5508 0.31640.9023 0.4336 0.6094 0.6680 0.0234 0.14060.8438 0.0820 0.4922 0.9609 0.7852 0.72660.3750 0.2578 0.5508 0.3164 0.9023 0.43360.6094 0.6680 0.0234 0.1406 0.8438 0.08200.4922 0.9609 0.7852 0.7266 0.3750 0.25780.5508 0.3164 0.9023 0.4336 0.6094 0.66800.0234 0.1406 0.8438 0.0820 0.4922 0.96090.7852 0.7266 0.3750 0.2578 0.5508 0.31640.9023 0.4336 0.6094 0.6680 0.0234 0.14060.8438 0.0820 0.4922 0.9609 0.7852 0.72660.3750 0.2578 0.5508 0.3164 0.9023 0.43360.6094 0.6680 0.0234 0.1406 0.8438 0.08200.4922 0.9609 0.7852 0.7266 0.3750 0.25780.5508 0.3164 0.9023 0.4336 0.6094 0.66800.0234 0.1406 0.8438 0.0820第二章的白噪声产生程序例2.2 用乘同余法产生(见光盘FLch2bzsheg2.m)①编程如下:A=6; x0=1; M=255; f=2; N=100;%初始化;x0=1; M=255;for k=1: N %乘同余法递推100次;x2=A*x0; %分别用x2和x0表示x i+1和x i-1;x1=mod (x2,M); %取x2存储器的数除以M的余数放x1(x i)中;v1=x1/256; %将x1存储器中的数除以256得到小于1的随机数放v1中;)减去0.5再乘以存储器f中的系数,存放v(:,k)=(v1-0.5 )*f; %将v1中的数(i在矩阵存储器v的第k列中,v(:,k)表示行不变、列随递推循环次数变化;x0=x1; % x i-1= x i;v0=v1;end %递推100次结束;v2=v %该语句后无‘;’,实现矩阵存储器v中随机数放在v2中,且可直接显示在MA TLAB的window中;k1=k;%grapher %以下是绘图程序;k=1:k1;plot(k,v,k,v,'r');xlabel('k'), ylabel('v');tktle(' (-1,+1)均匀分布的白噪声')②程序运行结果如图2.6所示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用乘同余法产生随机数1例2.1 用乘同余法产生随机数 (见光盘 FLch2sjxleg1.m)①编程如下:A=6; N=100; %初始化; x0=1; M=255;for k=1:N %乘同余法递推100次;x2=A*x0; %x2和x0分别表示x i 和x i-1;x1=mod (x2,M); %将x2存储器的数除以M ,取余数放x1(x i )中;v1=x1/256; %将x1存储器的数除以256得到小于1的随机数放v1中;v(:,k)=v1; % 将v1中的数(i)存放在矩阵存储器v 的第k 列中,v(:,k)%表示行不变、列随递推循环次数变化;x0=x1; %x i-1= x i;v0=v1;end %递推100次结束;v2=v %该语句末无‘;’,实现矩阵存储器v中随机数放在v2中,%且可直接显示在MATLAB的window中;k1=k;%grapher %以下是绘图程序;k=1:k1;plot(k,v,k,v,'r');2xlabel('k'), ylabel('v');tktle('(0-1)均匀分布的随机序列')②程序运行结果如图2.5所示。

图2.5 采用MATLAB产生的(0,1)均匀分布的随机序列图③产生的(0-1)均匀分布的随机序列在程序运行结束后,产生的(0,1)均匀分布的随机序列,直接从MATLAB的window界面中copy出来如下(v2中每行存6个随机数):v2 =0.0234 0.1406 0.8438 0.0820 0.4922 0.96090.7852 0.7266 0.3750 0.2578 0.5508 0.31640.9023 0.4336 0.6094 0.6680 0.0234 0.14060.8438 0.0820 0.4922 0.9609 0.7852 0.726630.3750 0.2578 0.5508 0.3164 0.9023 0.43360.6094 0.6680 0.0234 0.1406 0.8438 0.08200.4922 0.9609 0.7852 0.7266 0.3750 0.25780.5508 0.3164 0.9023 0.4336 0.6094 0.66800.0234 0.1406 0.8438 0.0820 0.4922 0.96090.7852 0.7266 0.3750 0.2578 0.5508 0.31640.9023 0.4336 0.6094 0.6680 0.0234 0.14060.8438 0.0820 0.4922 0.9609 0.7852 0.72660.3750 0.2578 0.5508 0.3164 0.9023 0.43360.6094 0.6680 0.0234 0.1406 0.8438 0.08200.4922 0.9609 0.7852 0.7266 0.3750 0.25780.5508 0.3164 0.9023 0.4336 0.6094 0.66800.0234 0.1406 0.8438 0.0820第二章的白噪声产生程序例2.2 用乘同余法产生(见光盘FLch2bzsheg2.m)①编程如下:A=6; x0=1; M=255; f=2;N=100;%初始化;x0=1; M=255;for k=1: N %乘同余法递推100次;x2=A*x0; %分别用x2和x0表示x i+1和x i-1;45x1=mod (x2,M); %取x2存储器的数除以M 的余数放x1(x i )中;v1=x1/256; %将x1存储器中的数除以256得到小于1的随机数放v1中;v(:,k)=(v1-0.5 )*f; %将v1中的数(i)减去0.5再乘以存储器f 中的系数,存放在矩阵存储器v 的第k 列中,v(:,k)表示行不变、列随递推循环次数变化;x0=x1; % x i-1= x i ; v0=v1;end %递推100次结束;v2=v %该语句后无‘;’,实现矩阵存储器v中随机数放在v2中,且可直接显示在MATLAB的window中;k1=k;%grapher %以下是绘图程序;k=1:k1;plot(k,v,k,v,'r');xlabel('k'), ylabel('v');tktle(' (-1,+1)均匀分布的白噪声')②程序运行结果如图2.6所示。

6图2.6 采用MATLAB产生的(-1,+1)均匀分布的白噪声序列③产生的(-1,1)均匀分布的白噪声序列在程序运行结束后,产生的(-1,1)均匀分布的白噪声序列,直接从MATLAB的window 界面中copy出来如下(v2中每行存6个随机数):v2 =-0.9531 -0.7188 0.6875 -0.8359 -0.0156 0.92190.5703 0.4531 -0.2500 -0.4844 0.1016 -0.36720.8047 -0.1328 0.2188 0.3359 -0.9531 -0.71880.6875 -0.8359 -0.0156 0.9219 0.5703 0.4531-0.2500 -0.4844 0.1016 -0.3672 0.8047 -0.13280.2188 0.3359 -0.9531 -0.7188 0.6875 -0.8359-0.0156 0.9219 0.5703 0.4531 -0.2500 -0.48440.1016 -0.3672 0.8047 -0.1328 0.2188 0.3359-0.9531 -0.7188 0.6875 -0.8359 -0.0156 0.92190.5703 0.4531 -0.2500 -0.4844 0.1016 -0.36720.8047 -0.1328 0.2188 0.3359 -0.9531 -0.71880.6875 -0.8359 -0.0156 0.9219 0.5703 0.4531-0.2500 -0.4844 0.1016 -0.3672 0.8047 -0.132870.2188 0.3359 -0.9531 -0.7188 0.6875 -0.8359-0.0156 0.9219 0.5703 0.4531 -0.2500 -0.48440.1016 -0.3672 0.8047 -0.1328 0.2188 0.3359-0.9531 -0.7188 0.6875 -0.8359*另外,书中图2.3白噪声的产生如下:显然,只要在例2.2程序的初始化部分中给N=300,f=6,运行程序就可以得到如图2.3所示的(-3,3)的白噪声过程.①编程如下:A=6; x0=1; M=255; f=6;N=300;%初始化;x0=1; M=255;for k=1: N %乘同余法递推100次;x2=A*x0; %分别用x2和x0表示x i+1和x i-1;x1=mod (x2,M); %取x2存储器的数除以M的余数放x1(x i)中;v1=x1/256; %将x1存储器中的数除以256得到小于1的随机数放v1中;89v(:,k)=(v1-0.5 )*f; %将v1中的数(i)减去0.5再乘以存储器f 中的系数,存放在矩阵存储器v 的第k 列中,v(:,k)表示行不变、列随递推循环次数变化;x0=x1; % x i-1= x i ; v0=v1;end %递推100次结束;v2=v %该语句后无‘;’,实现矩阵存储器v 中随机数放在v2中,且可直接显示在MATLAB的window中;k1=k;%grapher %以下是绘图程序;k=1:k1;plot(k,v,k,v,'r');xlabel('k'), ylabel('v');tktle(' (-1,+1)均匀分布的白噪声')②程序运行结果如图2.3所示。

图2.3 白噪声过程第二章的M序列产生程序例2.3 用移位寄存器产生M序列的MATLAB软件实现(见光盘FLch2bzsheg3.m)①编程如下:X1=1;X2=0;X3=1;X4=0; %移位寄存器输入Xi初T态(0101),Yi为移位寄存器各级输出m=60; %置M序列总长度for i=1:m %1#Y4=X4; Y3=X3; Y2=X2; Y1=X1;X4=Y3; X3=Y2; X2=Y1;X1=xor(Y3,Y4); %异或运算if Y4==0U(i)=-1;elseU(i)=Y4;endendM=U%绘图i1=ik=1:1:i1;plot(k,U,k,U,'rx')xlabel('k')ylabel('M序列')title('移位寄存器产生的M序列')②程序运行结果如图2.8 所示。

图2.8 软件实现的移位寄存器产生的M序列图.③'四级移位寄存器产生的M序列M =Columns 1 through 10-1 1 -1 1 1 1 1 -1 -1 -1Columns 11 through 201 -1 -1 1 1 -1 1 -1 1 1Columns 21 through 301 1 -1 -1 -1 1 -1 -1 1 1Columns 31 through 40-1 1 -1 1 1 1 1 -1 -1 -1Columns 41 through 501 -1 -1 1 1 -1 1 -1 1 1Columns 51 through 601 1 -1 -1 -1 1 -1 -1 1 1i1 =60。

相关文档
最新文档