急急急!!!!大哥们帮帮我!为什么能这样计算pi值?

littlereddog 2002-03-26 03:38:23
程序是这样的,计算的结果是3.14157,可能花费较长的时间,谢谢各位的帮助。程序如下:
是在vc6.0或者vc7.0下通过。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
int main()
{
int i;
int inside = 0;
double val;


srand( (unsigned)time( NULL ) );

for (i=0; i<1000000000; i++)
{
double x = (double)(rand())/RAND_MAX;
double y = (double)(rand())/RAND_MAX;
if ( (x*x + y*y) <= 1.0 )
inside++;
}
val = (double)inside / i;
printf("PI = %.12g\n", val*4);
return 0;
}
...全文
25 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
prototype 2002-03-26
to littlereddog ()

i think akiko(弥弥) has explained it very clearly.

what you might not fully understand, i guess, is how the possibility (概率) is calculated. it is actually quite simple:

for example:

把循环 for (i=0; i<1000000000; i++) 想象成 天下雨,一次循环,落下一滴雨。雨滴的落地点是随机的,x, y坐标由:
double x = (double)(rand())/RAND_MAX;
double y = (double)(rand())/RAND_MAX;
确定。然后假定你在地上画了个边长为1的正方形,正方形里面画了一个半径为1的圆。你可以设定让雨点落地的坐标都在正方形中(如上面的求x, y 的公式),那么所有的雨点要么在圆圈中,要么不在圆圈中(而在正方形中),这可由语句:
if ( (x*x + y*y) <= 1.0 )
inside++;
来判断并统计有多少的雨点落在圆圈中。当雨下完后(即循环结束后),从落入圆中的雨点数/总雨点数(val = (double)inside / i;),即可得雨落入圆中的概率。

这是monte carlo方法的一个应用。其原理还不是一贴就能讲透的。愿你能从这个例子中悟出什么, 并能可把它应用到其它计算上去。good luck.
回复
zyangxue 2002-03-26
菲伯拉数列中的前一个除以后一个的结果来计算不更好吗?
PI=for(n)/for(n+1) 其中的N越大就越精确
回复
kingfighter_han 2002-03-26
up
回复
fangrk 2002-03-26
好像2*pi=1-1/2+1/3-1/4+1/5-1/6......
(公式忘记了)
回复
twist 2002-03-26
用泰勒级数是否更好一点?
回复
akiko 2002-03-26
我是这样理解的:
x*x+y*y=1就是以(0,0)为原点,半径为1的一个圆。
这个算法可以看作是在以“(-1,1),(1,1),(1,-1),(-1,-1)”4个点为顶点的正方形内任取一点,看该点正好在圆内的概率。
这个概率 = 圆面积/正方形面积 = (PI*1*1)/(2*2) = PI/4。程序中最后显示的是val*4,呵呵,就是PI了。
i的范围越大得出的值相对越精确。
回复
prototype 2002-03-26
it is a typical monte carlo (门特卡罗)method. find a basic algorithm book.
回复
相关推荐
发帖
非技术区
创建于2007-09-28

1.5w+

社区成员

C/C++ 非技术区
申请成为版主
帖子事件
创建了帖子
2002-03-26 03:38
社区公告
暂无公告