蒙特卡洛算法优质PPT.ppt
《蒙特卡洛算法优质PPT.ppt》由会员分享,可在线阅读,更多相关《蒙特卡洛算法优质PPT.ppt(16页珍藏版)》请在冰豆网上搜索。
与真实随机数的差别在于,它们是由算法产生的,而不是一个真实的随机过程。
一般地,伪随机数的生成方法很多,有线性同余法,直接法,逆转法等,随机点的产生,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个点的产生,