正态分布随机数生成算法

上传人:mg****85 文档编号:34069523 上传时间:2018-02-20 格式:DOC 页数:7 大小:242.50KB
返回 下载 相关 举报
正态分布随机数生成算法_第1页
第1页 / 共7页
正态分布随机数生成算法_第2页
第2页 / 共7页
正态分布随机数生成算法_第3页
第3页 / 共7页
正态分布随机数生成算法_第4页
第4页 / 共7页
正态分布随机数生成算法_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《正态分布随机数生成算法》由会员分享,可在线阅读,更多相关《正态分布随机数生成算法(7页珍藏版)》请在金锄头文库上搜索。

1、概率论与数理统计课程设计题目:正态分布随机数生成算法要编程得到服从均匀分布的伪随机数是容易的。C 语言、Java 语言等都提供了相应的函数。但是要想生成服从正态分布的随机数就没那么容易了。得到服从正态分布的随机数的基本思想是先得到服从均匀分布的随机数,再将服从均匀分布的随机数转变为服从正态分布。接下来就先分析三个从均匀分布到正态分布转变的方法。然后编程实现其中的两个方法并对程序实现运作的效果进行统计分析。1、 方法分析(1 ) 利用分布函数的反函数若要得到分布函数为 F(x)的随机变量 Y。可令 , 其中 u 是服从均匀分布的随机变量,有1()YF1()(PyUF因而,对于任意的分布函数,只要

2、求出它的反函数,就可以由服从均匀分布的随机变量实例来生成服从该分布函数的随机变量实例。现在来看正态分布的分布函数,对于 ,其分布函数为:2(,)XN2()1()txFxe显然,要想求其反函数是相当困难的,同时要想编程实现也很复杂。可见,用此种方法来生成服从正态分布的随机变量实例并不可取。(2 ) 利用中心极限定理第二种方法利用林德伯格莱维(Lindeberg Levi)中心极限定理:如果随机变量序列独立同分布,并且具有有限的数学期望和方差12,nXL则对一切 有20(1,)iiEDiLxR211limtnxiniPXed因此,对于服从均匀分布的随机变量 ,只要 n 充分大,随机变量i就服从 。

3、我们将实现这一方法。1niiX0,1N(3 ) 使用 Box Muller 方法先证明 :2xed令 ,则2xI2222xyxyIeded令 ,则有cos,inxrr。2 2200rrIeded接下来再来得出 Box Muller 方法:设 为一对相互独立的服从正态分布的随机变量。则有概率密度函数,XY2,1xyYfxye令 ,其中 ,则 有分布函数:cos,inR0,R2222001() 1uurr rPedede令 2rRF1ln1ZZ如果 服从均匀分布,则 的分布函数即为 。XRRFr最后,可以 用代替 ,令 为 ,其中 , ,得:1U2U10,2,1U1 1cos2lncos,sinl

4、sinY从而,只需要有两个服从均匀分布的随机变量 ,就能通过公式1212cslcsXRU来得到一个服从正态分布的随机变量 。用 Box Muller 方法来生成服从正态分布的随X机数是十分快捷方便的。我们也将实现这一方法。2、 实现与分析(1) 利用中心极限定理方法的实现与分析利用中心极限定理来生成随机数的函数(C+语言)编写如下:const int N = 200;double getRand()double s = 0;for (int i = 0; i != N; +i)s += double(rand() % 1000) / 1000;return s;函数生成的随机数是 N 个0,1

5、间服从均匀分布的随机数的和。这里 N 为 200。从而理论上产生的随机数应近似服从 ,其中 n 为 N,即 200, 为 0.5, 为2(,)n21/12。程序生成了 200 个随机数,并求出样本均值与样本方差,也即 与 的最大似然估计:/生成随机数并存储double sum, store200, xi, su = 0, sb = 0, ssb = 0;int cnt = 0;sum = 0;for (int i = 0; i != 200; +i)xi = getRand();sum += xi;storei = xi;/得到样本均匀与样本方差su = sum / 200;for (int

6、i = 0; i != 200; +i)sb += (storei - su) * (storei - su);sb /= 200;ssb = sqrt(sb);此次选取 1234567890,9,98,10,2,104,yyyy,它们将实轴分成11个互不相交的区间,从而将样本值分成11组。96,8程序统计了每组中的样本数量。为方便计算,程序还计算出了 :()iint segments12, m = 2;double x1 = 90, x10 = 108;memset(segments, 0, sizeof(segments);for (int i = 0; i != 200; +i)if (

7、storei x10)+segments10;else+segmentsint(storei - x1) / m + 1);cout i t ni endl;for (int i = 0; i != 11; +i)cout i + 1 t segmentsi;if (i 10)cout t fixed setprecision(2) (90 + i * 2 - su) / ssb;cout endl;程序的最终运行输出如图21所示。图21 最终输出结果对结果的统计如表21所示。由表21中可见 ,今 并令213.801,2km,则 由于 ,故可认为产生0.5220.58.7km5.7的随机数服从

8、正态分布。表21i1(,iiyinip20iinp12345678910(,902,4(69,810(,24,6(108,210374621500.19265.340.1269.750.439.160.6125.3490.165.48320.159.638利用中心极限定理的方法虽然可以得到服从正态分布的随机数样本,其思想也较为简单,容易想到。但是这种方法每次都要先产生若干个服从均匀分布的随机数样本并求它们的和,因而算法的时间复杂度高。(2) Box Muller 方法的实现与分析使用 Box Muller 方法得到随机数的函数如下:double getRand()double u1 = dou

9、ble(rand() % 10000) / 10000, u2 = double(rand() % 10000) / 10000, r;r = 20 + 5 * sqrt(-2.0 * (log(u1) / log(e) * cos(2 * pi * u2);return r;用此函数得到的随机数样本理论上服从 。所实现的程序产生了 500 个随机(20,5)N变量的样本其他与利用中心极限定理的实现基本相同。程序得到的最终结果如图 22 所示。图 2-2对结果的统计如表 2-2 所示。表 22i1(,iiyinip250iinp12345678910(,021,4(6,820(,4,6(28,17354869215300.253.6890.1254.30.986724.1.6890.7318.60.51.29由表 22 可见 ,今 并令 ,则21.91,2km0.5由于 ,故可认为产生的随机数服从正态0.587km.9.7分布。Box Muller 方法的推导过程较为复杂。但得到的结果却是很令人满意的。只要用两个相互独立的均匀分布就能得到正态分布。而且产生随机数的时间复杂度比利用中心极限定理的方法要低很多。因而若要产生服从正态分布的随机数样例,则 Box Muller 方法是一个很不错的选择。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号