C语言 用门特卡罗方法(随机方法)求得的圆周率为何略小与实际的圆周率?

来源:百度知道 编辑:UC知道 时间:2024/05/18 02:13:37
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
void main()
{
long i,samples = 500000000;
double x,y,ratio,piestimate;
long hits = 0;
/*i计数器,samples样本数,x和y随机产生的点的坐标,ratio随机点在圆内的概率,piestimate圆周率,hits随机点在圆内的次数*/

srand (time (0)); /*初始化随机种子*/

for (i=1;i<samples;++i)
{
x = 1.0 * rand() / (double)RAND_MAX; /*产生0-1之间的随机数*/
y = 1.0 * rand() / (double)RAND_MAX; /*产生0-1之间的随机数*/

if ( (x-0.5)*(x-0.5) + (y-0.5)*(y-0.5) < 0.25 ) ++hits; /*圆心在(0.5,0.5)*/

if(i%5000000==0)
printf("i=%ld,pi=%f\n",i,4.0*hits/i);
}
ratio = hits*1.0/samples;
piestimate = 4*ratio;
printf("\npi=%f",piestimate);
}
但是次数够多之后总是稳定在3.1413.......
比3.14159大的情况只是占少数。

很正常啊,系统产生的本来就不是真正的随机数啊.

问题补充:但是次数够多之后总是稳定在3.1413.......
比3.14159的情况只是占少数。
=============================================
关于你补充的问题,我帮你查了一下,
从理论上来说,蒙特卡罗方法需要大量的实验。实验次数越多,所得到的结果才越精确。
以投针实验为例、尽管实验次数数以千计,利用蒙特卡罗方法所得到的圆周率∏值,还是达不到公元5世纪祖冲之的推算精度。这可能是传统蒙特卡罗方法长期得不到推广的主要原因。

网络上还有几个人执著的尝试了一下,结果如下:
运行500万次(10分钟左右),运行完毕后,精度大约能达到3.14145
不设上限运行次数,运行一夜(8个小时),算出了小数点后10位左右精确值

看来还是运行时间不够啊~~~~~~~~~~~~

呵呵,你的代码没有问题,主要是正好被你赶上了那一段随机数生成的圆周率较小。
我运行了几次,都看到了不少大的,
截取一段给你放心一下:
i=5000000,pi=3.140949
i=25000000,pi=3.141453
i=30000000,pi=3.141460
i=35000000,pi=3.141474
i=40000000,pi=3.141630 //大的
i=45000000,pi=3.141594 //大的
i=50000000,pi=3.141756 //大的
i=55000000,pi=3.141642 //大的
i=60000000,pi=3.141495
i=65000000,pi=3.141496
i=70000000,pi=3.141544
i=75000000,pi=3.141539
i=80000000,pi=3.141485
i=85000000,pi=3.141447
i=90000000,pi=3.141435
i=