您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 正态分布随机数生成算法
概率论与数理统计课程设计题目:正态分布随机数生成算法要编程得到服从均匀分布的伪随机数是容易的。C语言、Java语言等都提供了相应的函数。但是要想生成服从正态分布的随机数就没那么容易了。得到服从正态分布的随机数的基本思想是先得到服从均匀分布的随机数,再将服从均匀分布的随机数转变为服从正态分布。接下来就先分析三个从均匀分布到正态分布转变的方法。然后编程实现其中的两个方法并对程序实现运作的效果进行统计分析。1、方法分析(1)利用分布函数的反函数若要得到分布函数为F(x)的随机变量Y。可令1()YFu,其中u是服从均匀分布的随机变量,有1()(())()PYyPUFyFy因而,对于任意的分布函数,只要求出它的反函数,就可以由服从均匀分布的随机变量实例来生成服从该分布函数的随机变量实例。现在来看正态分布的分布函数,对于2~(,)XN,其分布函数为:22()21()2txFxe显然,要想求其反函数是相当困难的,同时要想编程实现也很复杂。可见,用此种方法来生成服从正态分布的随机变量实例并不可取。(2)利用中心极限定理第二种方法利用林德伯格—莱维(Lindeberg—Levi)中心极限定理:如果随机变量序列12,,,,nXXX独立同分布,并且具有有限的数学期望和方差2,0(1,2,),iiEXDXi则对一切xR有22111lim2tnxiniPXnxedtn因此,对于服从均匀分布的随机变量iX,只要n充分大,随机变量11niiXnn就服从0,1N。我们将实现这一方法。(3)使用BoxMuller方法先证明222xedx:令22xIedx,则22222222xyxyIedxedyedxdy令cos,sinxryr,则有22222200022rrIerdrderdr。接下来再来得出BoxMuller方法:设,XY为一对相互独立的服从正态分布的随机变量。则有概率密度函数222,1,2xyXYfxye令cos,sinxRyR,其中~0,2,则R有分布函数:22222220001()12uurrrPRreududeudue令221rRFre12ln1RRFZZ如果X服从均匀分布,则R的分布函数即为RFr。最后,可以1U用代替1Z,令为22U,其中1~0,1UU,2~0,1U,得:1212cos2lncos2,sin2lnsin2XRUUYRUU从而,只需要有两个服从均匀分布的随机变量12,UU,就能通过公式12cos2lncos2XRUU来得到一个服从正态分布的随机变量X。用BoxMuller方法来生成服从正态分布的随机数是十分快捷方便的。我们也将实现这一方法。2、实现与分析(1)利用中心极限定理方法的实现与分析利用中心极限定理来生成随机数的函数(C++语言)编写如下:constintN=200;doublegetRand(){doubles=0;for(inti=0;i!=N;++i)s+=double(rand()%1000)/1000;returns;}函数生成的随机数是N个[0,1]间服从均匀分布的随机数的和。这里N为200。从而理论上产生的随机数应近似服从2(,)Nnn,其中n为N,即200,为0.5,2为1/12。程序生成了200个随机数,并求出样本均值与样本方差,也即与2的最大似然估计://生成随机数并存储doublesum,store[200],xi,su=0,sb=0,ssb=0;intcnt=0;sum=0;for(inti=0;i!=200;++i){xi=getRand();sum+=xi;store[i]=xi;}//得到样本均匀与样本方差su=sum/200;for(inti=0;i!=200;++i)sb+=(store[i]-su)*(store[i]-su);sb/=200;ssb=sqrt(sb);此次选取1234567890,92,94,96,98,100,102,104,yyyyyyyy910106,108yy,它们将实轴分成11个互不相交的区间,从而将样本值分成11组。程序统计了每组中的样本数量。为方便计算,程序还计算出了ˆ()ˆiy:intsegments[12],m=2;doublex1=90,x10=108;memset(segments,0,sizeof(segments));for(inti=0;i!=200;++i){if(store[i]=x1)++segments[0];elseif(store[i]x10)++segments[10];else++segments[int((store[i]-x1)/m+1)];}cout'i''\t'niendl;for(inti=0;i!=11;++i){couti+1'\t'segments[i];if(i10)cout'\t'fixedsetprecision(2)(90+i*2-su)/ssb;coutendl;}程序的最终运行输出如图2-1所示。图2-1最终输出结果对结果的统计如表2-1所示。由表2-1中可见213.380,今11,2,km并令0.05,则220.051815.507.km由于13.38015.507,故可认为产生的随机数服从正态分布。表2-1i1(,]iiyyinˆip2ˆ200ˆ200iiinpp1234567891011(,90](90,92](92,94](94,96](96,98](98,100](100,102](102,104](104,106](106,108](108,]22101237464223151010.01190.02650.06010.11340.16640.20690.17400.12950.07460.03390.01660.0612.0550.0345.0290.4160.5161.4890.3250.0001.5291.62113.380利用中心极限定理的方法虽然可以得到服从正态分布的随机数样本,其思想也较为简单,容易想到。但是这种方法每次都要先产生若干个服从均匀分布的随机数样本并求它们的和,因而算法的时间复杂度高。(2)BoxMuller方法的实现与分析使用BoxMuller方法得到随机数的函数如下:doublegetRand(){doubleu1=double(rand()%10000)/10000,u2=double(rand()%10000)/10000,r;r=20+5*sqrt(-2.0*(log(u1)/log(e)))*cos(2*pi*u2);returnr;}用此函数得到的随机数样本理论上服从(20,25)N。所实现的程序产生了500个随机变量的样本其他与利用中心极限定理的实现基本相同。程序得到的最终结果如图2-2所示。图2-2对结果的统计如表2-2所示。表2-2i1(,]iiyyinˆip2ˆ500ˆ500iiinpp1234567891011(,10](10,12](12,14](14,16](16,18](18,20](20,22](22,24](24,26](26,28](28,]17113547586492615530300.02500.03320.06080.09580.12980.15140.15200.13140.09860.07240.06061.621.890.690.010.731.813.360.330.651.060.0012.19由表2-2可见212.19,今11,2,km并令0.05,则220.051815.507.km由于12.1915.507,故可认为产生的随机数服从正态分布。BoxMuller方法的推导过程较为复杂。但得到的结果却是很令人满意的。只要用两个相互独立的均匀分布就能得到正态分布。而且产生随机数的时间复杂度比利用中心极限定理的方法要低很多。因而若要产生服从正态分布的随机数样例,则BoxMuller方法是一个很不错的选择。
本文标题:正态分布随机数生成算法
链接地址:https://www.777doc.com/doc-5174683 .html