//由于线性同余法产生的伪随机数时总会重复,在进行大量生成时性能不好,通过查阅相关
//资料,作者发现了随机数池法,并自主编程实现,可以同时生成大量的真正的随机数。
//通过蒙特卡罗法来测试,生成的 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;
}