logo资料库

比线性同余法更好的生成随机数的方法.docx

第1页 / 共2页
第2页 / 共2页
资料共2页,全文预览结束
//由于线性同余法产生的伪随机数时总会重复,在进行大量生成时性能不好,通过查阅相关 //资料,作者发现了随机数池法,并自主编程实现,可以同时生成大量的真正的随机数。 //通过蒙特卡罗法来测试,生成的 PI 的值为 3.14,比用线性同余法生成伪随机数所求得 //的 3.22 效果要好得多 //by 迷途 de 羔狼 2011.10 #include #include #include int main() { int a[1000];//生成个数为 1000 float b[1000];//小数 srand((int)time(0));//刚开始用系统时间当种子,否则所有的仿真结果都一样 int i,j; int t; int l,w; float ans[1000]; for(j=0;j<1000;j++)//仿真 1000 次 { for(i=0;i<4000;i++) { t=rand(); a[i%1000]=(t+a[i%1000])%65535; srand(t*97+i*a[t%1000]);//算法核心部分 //srand 保证每次产生的随机数不一样 } for(i=0;i<1000;i++) { b[i]=(float)a[i]/65535.0;//0~1 的随机小数 } l=0; w=0; //仿真 for(i=0;i<500;i++) { if( b[i]*b[i]+b[i+500]*b[i+500]<= 1 ) //即为 x^2+y^2>1 该部分的面积为 pi/4 l++; else w++; } ans[j]=(float)l/(float)(l+w)*4;//求 pi printf("answer %d = %f\n",j,ans[j]); }
float sum=0; for(j=0;j<1000;j++) { sum+=ans[j]; } printf("\nlast answer =%f\n",sum/100.0);//pi 的平均值 getchar(); return 0; }
分享到:
收藏