蒙特卡洛算法优质PPT.ppt

上传人:b****1 文档编号:14156652 上传时间:2022-10-19 格式:PPT 页数:16 大小:190.50KB
下载 相关 举报
蒙特卡洛算法优质PPT.ppt_第1页
第1页 / 共16页
蒙特卡洛算法优质PPT.ppt_第2页
第2页 / 共16页
蒙特卡洛算法优质PPT.ppt_第3页
第3页 / 共16页
蒙特卡洛算法优质PPT.ppt_第4页
第4页 / 共16页
蒙特卡洛算法优质PPT.ppt_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

蒙特卡洛算法优质PPT.ppt

《蒙特卡洛算法优质PPT.ppt》由会员分享,可在线阅读,更多相关《蒙特卡洛算法优质PPT.ppt(16页珍藏版)》请在冰豆网上搜索。

蒙特卡洛算法优质PPT.ppt

与真实随机数的差别在于,它们是由算法产生的,而不是一个真实的随机过程。

一般地,伪随机数的生成方法很多,有线性同余法,直接法,逆转法等,随机点的产生,C/C+语言中伪随机数生成算法实际上是采用了“线性同余法“。

具体的计算如下:

Xi=(Xi-1*A+C)modM其中A,C,M都是常数(一般会取质数)。

当C=0时,叫做乘同余法。

引出一个概念叫seed,它会被作为X0被代入上式中,然后每次调用rand()函数都会用上一次产生的随机值来生成新的随机值。

可以看出实际上用rand()函数生成的是一个递推的序列,一切值都来源于最初的seed。

所以当初始的seed取一样的时候,得到的序列都相同。

C语言里面有RAND_MAX这样一个宏,定义了rand()所能得到的随机值的范围。

在C里可以看到RAND_MAX被定义成0x7fff,也就是32767。

rand()函数里递推式中M的值就是32767。

线性同余法生成的是伪随机数,粗略符合均匀分布。

随机点的产生,准随机算法伪随机算法都存在差异性,不均匀性。

因此,不要求新的发生器模拟真实的均匀分布,而力求任意大小的样本(尤其是小样本)都能满足低差异性。

换言之,以牺牲随机性为代价,换来均匀性的提高,称其为准随机模拟器。

目前有3种准随机序列可用来辅助生成均匀分布随机数,分别是Halton序列、Sobol序列、Latin超立方体序列。

随机点的产生,Halton序列以质数为基底产生的序列假设是以质数2为基底的Halton序列,范围在01之间。

则从产生的列为1/21/43/41/85/83/87/81/169/16.怎么产生的呢?

3=1+25=1+47=3+49=1+8.假设以质数3为基底,Halton序列如下1/32/31/94/97/92/95/98/91/2710/2719/27.,随机点的产生,在二维中,01之间产生的点的序列就是(1/2,1/3)(1/4,2/3)(3/4,1/9)(1/8,4/9)(5/8,7/9)(3/8,2/9)(7/8,5/9)(1/16,8/9)(9/16,1/27).,核心代码分析,privatestaticclassHaltonSequence/Halton序列的产生staticfinalintP=2,3;

/以2、3为基底产生序列staticfinalintK=63,40;

/使2和3产生的序列中元素的个数相同privatelongindex;

/索引项privatedoublex;

/x数组定义privatedoubleq;

/二维数组q定义privateintd;

/二维数组d定义HaltonSequence(longstartindex)/输入参数值,得到序列中的元素index=startindex;

x=newdoubleK.length;

/K.length=2q=newdoubleK.length;

d=newintK.length;

for(inti=0;

iK.length;

i+)/给q,d赋值qi=newdoubleKi;

/q0=63,q1=40di=newintKi;

/d0=63,d1=40,for(inti=0;

i+)longk=index;

/把参数传给kxi=0;

for(intj=0;

jKi;

j+)/这部分通过运算来演示qij=(j=0?

1.0:

qij-1)/Pi;

dij=(int)(k%Pi);

k=(k-dij)/Pi;

xi+=dij*qij;

doublenextPoint()/根据上面求得的点来产生第二个点index+;

i+)for(intj=0;

j+)dij+;

xi+=qij;

if(dijPi)break;

dij=0;

xi-=(j=0?

qij-1);

returnx;

改写后的程序(C+版)#include#includeusingnamespacestd;

intP2=2,3;

intK2=63,40;

longindex;

doublex2;

doubleq2100;

intd2100;

voidHaltonSequence()index=1;

i2;

xi=0;

j+)qij=(j=0?

voidnextPoint()index+;

voidmain()inti;

HaltonSequence();

cout(x0,x1)endl;

for(i=0;

i500;

i+)nextPoint();

500个点的产生,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1