1 / 19
文档名称:

随机数的产生.docx

格式:docx   大小:340KB   页数:19页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

随机数的产生.docx

上传人:guoxiachuanyue013 9/23/2022 文件大小:340 KB

下载得到文件列表

随机数的产生.docx

相关文档

文档介绍

文档介绍:该【随机数的产生 】是由【guoxiachuanyue013】上传分享,文档一共【19】页,该文档可以免费在线阅读,需要了解更多关于【随机数的产生 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。随机数的产生
摘要
本文研究了连续型随机数列的产生,先给出了均匀分布的随机数的产生算法,,我们给出了产生均匀分布随机数的算法,,我们列举了几种通用算法,并讨论各个算法的优缺点,最后以正态分布为例验证高效舍选法的优势.
正文
一、随机数与伪随机数
随机变量n的抽样序列耳,耳,…耳,…称为随机数列.
12n
如果随机变量n是均匀分布的,则n的抽样序列耳,耳,…耳,…称为均匀随机数列;
12n
如果随机变量n是正态分布的随机变量则称其抽样序列为正态随机数列.
比如在掷一枚骰子的随机试验中出现的点数x是一个随机变量,该随机变量就服从离散型均匀分布,x取值为1,2,3,4,5,6,取每个数的概率相等均为1/
到x的随机数?通过重复进行掷骰子的试验得到的一组观测结果x,x,…x,…就是x的
12n
,1,2,…,9的离散型均匀分布的随机数,通常的操作方法是把10个完全相同的乒乓球分别标上0,1,2,„,9,然后放在一个不透明的袋中,搅拦
均匀后从中摸出一球记号码x后放回袋中,接着仍将袋中的球搅拌均匀后从袋中再摸出
1
一球记下号码x后再放回袋中,依次下去,就得到随机序列x,x,…x,通常称类似
212n
,当我们需要大量的随机数时,这种实际操作方法需要花费大量的时间,通常不能满足模拟试验的需要,比如教师不可能在课堂上做10000次掷硬币的试验,,那么计算机产生的随机数是用类似摸球方法产生的吗?,实际上是按照一定的计算方法得到的一串数,它们具有类似随机数的性质,但是它们是依照确定算法产生的,便不可能是真正的随机数,,只要通过统计检验符合一些统计要求,如均匀性、随机性
等,就可以作为真正的随机数来使用,:
产生的随机数列要有均匀性、抽样的随机性、试验的独立性和前后的一致性.
产生的随机数列要有足够长的周期,以满足模拟实际问题的要求.
产生随机数的速度要快,占用的内存少.
计算机产生随机数的方法内容是丰富的,在这里我们介绍几种方法,计算机通常是先产生[0,1]区间上均匀分布的随机数,然后再产生其他分布的随机数.
二、均匀分布随机数的产生

在vc的环境下,为我们提供了库函数rand()~RAND_MAX之间平均分布的,RAND_MAX是一个常量,:
#defineRAND_MAX0x7fff
它是一个short型数据的最大值,如果要产生一个浮点型的随机数,可以将rand()/~,-1000~:
inta=rand()%10000;
然后保留四位小数产生0~1之间的随机小数:
doubleb=(double)a/;
然后通过线性组合就可以实现任意范围内的随机数的产生,要实现
-1000~1000内的平均分布的随机数可以这样做:
doubledValue=(rand()%10000)/*1000-(rand()%10000)/*1000;
则dValue就是所要的值.
但是,上面的式子化简后就变为:
doubledValue=(rand()%10000)/-(rand()%10000)/;
这样一来,产生的随机数范围是正确的,但是精度不正确了,变成了只有一位正确的小数的随机数了,后面三位的小数都是零,显然不是我们要求的,什么原因呢,又怎么办呢.
先找原因,rand()产生的随机数分辨率为32767,两个就是65534,而经过求余后分辨度还要减小为10000,两个就是20000而要求的分辨率为1000*10000*2=20000000,
果:
doublea=(rand()%10000)*(rand()%1000)/;
doubleb=(rand()%10000)*(rand()%1000)/;
doubledValue=a-b;
,精度是4位小数.
doubleAverageRandom(doublemin,doublemax)
{
intminInteger=(int)(min*10000);
intmaxInteger=(int)(max*10000);
intrandInteger=rand()*rand();
intdiffInteger=maxInteger-minInteger;
intresultInteger=randInteger%diffInteger+minInteger;
intresultInteger=randInteger%diffInteger+minInteger;
returnresultInteger/;
}
但是有一个值得注意的问题,随机数的产生需要有一个随机的种子,因为用计算机产生的随机数是通过递推的方法得来的,必须有一个初始值,也就是通常所说的随机种子,如果不对随机种子进行初始化,那么计算机有一个缺省的随机种子,这样每次递推的结果就完全相同了,因此需要在每次程序运行时对随机种子进行初始化,在vc中的方法是调用srand(int)这个函数,其参数就是随机种子,但是如果给一个常量,则得到的随机序列就完全相同了,因此可以使用系统的时间来作为随机种子,因为系统时间可以保证它的随机性.
调用方法是srand(GetTickCount()),但是又不能在每次调用rand()的时候都用srand(GetTickCount())来初始化,因为现在计算机运行时间比较快,当连续调用rand()时,系统的时间还没有更新,所以得到的随机种子在一段时间内是完全相同的,-1~[400];
srand(GetTickCount());
for(inti=0;i<400;i++)
{
doubledValue[i]=AverageRandom(-1,1);
}
用该方法产生的随机数运行结果如图1所示:
n
图1400个-1~1之间平均分布的随机数
:用同余法产生随机数
同余法简称为LCG(LinearCongruenceGener-ator),.
同余法(LCG)递推公式为
x=(ax+c)(modm)(n=1,2,…),(1)
nn-1
其中x,a,.,就可以由式⑴得到整数序列{x},对每一
nn
x,作变换u=x/m,贝I」{u}(n=1,2,„)就是[0,1){u}通过了
nnnnn
统计检验,那么就可以将u作为[0,1)上的均匀分布随机数.
n
在式⑴中,若c=0,则称相应的算法为乘同余法,并称口为乘子;若cM0,贝I」,其中x称为种子.
0
由式(1)可以看出,对于十进制数,当取模m=10k(k为正整数)时,求其同余式运算较
=31236(mod102),只要对21236从右截取k=2位数,,
对于二进制数,取模m=2k时,求其同余式运算更简便了.

上,按式(1)求以m为模的同余式时,,取模m=2l,若按式(1)求同余式时,显然有
当ax+c<m时,贝Ux=ax+c;
n-1nn-1
当ax+c>m时,贝Ux=ax+c一m[(ax+c)/m].
n-1nn-1n-1
这里[X],-1n
,由于计算机的整数尾部字长为L,机器中可存放的最大整
数为2l-1,而此时ax+c>m>2l-1,因此ax+c在机器里存放时占的位数多于L位,n-1n-1
于是发生溢出,=2l的剩余,
少了除法运算,=2l(L为计算机尾部字长),正是利用了溢出原理来减少除法运算.
由式⑴产生的x(n=1,2,……),到一定长度后,会出现周而复始的周期现象,即{x}nn
可以由其某一子列的重复出现而构成,这种重复出现的子列的最短长度称为序列x的周
n
(1)不难看出,{x}中两个重复数之间的最短距离长度就是它的周期,用T代表
n
,,通常只能取{x}的一个周
n
,为了产生足够多的随机数,就必须{x}的周期尽可n
,一般取m=2L,这就是说模m已取到计算机能表示的数的最大数值,
意即使产生的随机数列{x}的周期达到可能的最大数值,如适当地选取参数x,a,c等,
n0
还可能使随机数列{x}达到满周期.
三、非均匀分布随机数的产生

(x)表为其它一些概率密度的线性组合.

n
.
若分布密度函数f(X)能表为如下式(2)所示的函数项级数的和,
f(x)=?pf(x)(2)
ii
i二1
其中ILp,诸f(X)(X)一次抽样.
i
i二1
(1)产生一个随机自然数I,使I服从如下分布律:P(l=i)=pi=1,2,
i
3„„
(2)产生服从f(X)的随机数X
I0
证明利用全概率公式,有:
P(x<X<x+dx)=工P(I=i)P(x<X<x+dx|I=i)
i二1
=乙pf(x)dx
ii
i二1=f(x)dx
故X服从f(x)分布.
我们以产生双指数(或拉普拉斯)
概率密度函数f(x)=-x,如图2:
n
图2双指数密度函数f(x)可表为:
f(x)=(x)+(x)(3)
lr
其中f(x)是指数分布,f(x)
方法:产生U,U~U(0,1);若U>,则令X=InU,否则X=-InU.
12122
在式(2)中,若iT8,有pT0,则可用函数列{pf(x)}的前有限项和逼近f(X).
iii这是一种近似的方法,(在某种“精度”的
意义之下)达到要求,我们就可以采用近似的方法•使用组合法时,各f(X)的抽样应该
i
容易产生,故选用合适的概率密度函数族{f(X)}把任意连续分布表为式(2),乃是使用组
i
合法的关键.

这是一种比较新的通用随机数产生方法•其主要的目的是对一般的f(X)找出较好的覆盖函数以达到较高的效率•我们知道,对某一特定的概率密度f(x),,:
使用一个变换函数T(x)把预定密度函数f(x)变换为h(x)=T(f(x)),用一个分段线性函数l(x履盖h(x),如图2-4左图;h(x)若是上凸的,则T-1(l(x)將是f(x)的一个较好的覆盖函数,
这个方法在选择合适的T(x)(log(x)或1/xa等)后,能产生随机数包括了较多
,但需要较多的函数计算,不太适合硬件实现.
此外,-of-,其产生的随机数与指定分布的随机数具有相同的前四阶矩,.

当前的通用算法的问题是效率不能任意提高,(x)等函数•我们认为在速度要求非常高的场合,计算f(x)是不利的,,、指数、对数等超越函数的计算,以便硬件实现.
产生任意连续分布随机数的高效舍选算法
本文提出一种通用算法,可视需要使效率接近1,而且f(X)(例如通信系统的误码率测试,可能需要数小时乃至数天的仿真时间),本算法将有很大的优势,尽管有看法认为只有能用简单代码实现的算法才会被经常使用.

假定预定的连续概率密度函数f(X)为单峰的(这是实际的大多数情况),已知其峰值点为m.—般f(x)不关于x=m对称,如图2-(x)定义在有界的区间[a,b]上(上文说过,对正态分布这类定义区间无限的情况,我们把这个区间取得足够大就可以了).直线X=m把f(x)曲线与X轴所围面积分为左右两部分,我们把左右两部分各等分为K份,一共得到2K个曲边梯形•并用2K个矩形各自覆盖相应的曲边梯形•如
图4所示(图中各均分为四份).Ri,Li(i=1,2,…,K-1)是分点•并令R=L=m,
00
L=a,R=b.
kk
图4均分f(x)曲线与X轴所围面积
我们的想法是利用舍选法的几何意义,分别在上述2K个曲边梯形内均匀投点,从而使随机点在f(x)曲线与x轴所围的整个区域中均匀分布,这样即可产生f(x):先在各个矩形内均匀投点,,显然效率大大高于简单舍选法•最为重要的是:随着K的增大,效率会不断提高•另外,只有当投点位于曲边梯形的曲边之下时,才需计算f(x),而且计算f(x)概率是随着K的增加而减小的.
我们每次“按概率”随机选中一个曲边梯形进行投点•这需要两步完成:先选择左边还是右边,,这可以从以下的推导中看出来•为清晰起见,我们先阐述随机数的产生法,而把面积的均分这个预处理过程置于随后.

m
令P=ff(x),右边各曲边梯形
—g
面积皆为((I-P)/(x)可表为:
f(x)=—为f(x)+为f(x)⑷
K1iK2i
i=1i=1
诸f(x)(j=1,2;i=1,2...k)皆为一腰为曲边的梯形形状的概率密度函数.
ji

最近更新

[定稿]教科版六年级下册科学期末试卷答案 9页

我国环境问题现状 原因 对策 48页

2022年上海理工大学管理学院招考聘用模拟试卷【附答案解析】(2) 110页

我国材料的历史进程、分类及学科延伸 64页

课堂智慧艺术期末试题 30页

幼儿园食品安全事故应急预案(4篇) 8页

会计人员实习工作总结范文 16页

悬挂式干粉灭火装置培训资料2017.11.6(PPT31页) 32页

2022山东滨州市阳信县公开招聘事业单位人员56人模拟试卷【附答案解析】(1) 110页

幼儿常见传染病防治 25页

2022山东淄博临淄区事业单位综合类岗位公开招聘75人模拟试卷【附答案解析】(4) 112页

性格与人际沟通定律分析 50页

思源销售精英训练培训课程 84页

思源 银川北塔湖项目规划设计建议报告 152 152页

2022山东临沂市平邑县结合事业单位人员公开招聘征集大学毕业生入伍7人模拟试卷【附答.. 118页

年度2022铁路列车长述职报告经典2022 3页

2022年继续医学教育工作总结 3页

压力容器设计质量体系记录表2021版 78页

山西民办学校换发办学许可证登记表 4页

营业部跟单员岗位职责 3页

森林火灾损失评估技术规范(试行) 17页

劳动竞赛实施方案2016 4页

南华大学第四次团代会筹备工作分工 - 共青团南华大学委员会 9页

济南市国有企业投资监督管理暂行办法+济南市国有企业发展战略和规划监督管理暂行办法 16页