是根据圆的面积四分之一圆的面积s=1/4(π*1*1).小单位正方形的面积是S=1.他们的面积比为π:4.在运用在这个小方格中丢米粒,落在小方格内美的那的概率相等的这种“随机”性,我就写出了如下C语言程序,请问看是哪一点出错了呢?
#include <stdlib.h> #include <stdio.h>
#include <time.h>
#define MAX 10000 //随机试验的实验次数为MAX
int count,a=0; double x, y, pi;
time_t t;
int main( void ) {
srand((unsigned) time(&t));
for(count = 0; count < MAX; count ++)
{
x = (double)(rand() % 10000);
y = (double)(rand() % 10000);
if(x*x+y*y<=1)
a=a+1; //frequence in the 1/4 circle.
}
/*Get pi*/
pi = (double)( a / MAX ) * 4.0;
printf(" Pi is = %f \n", pi);
return 0;
}
先谢谢了。
你的程序是模拟大量随机事件来求pi的近似值。有两点给你纠正的:
1、
x = (double)(rand() % 10000);
y = (double)(rand() % 10000);
x/、y都是小于10000的数表示(x,y)这个随机点是落在了长10000,宽10000的矩形也就是正方形中,所以if (x*x+y*y <= 10000*1000)表示这个点落在了以10000为半径的圆内,所以,你的
if(x*x+y*y<=1)应该改为if (x*x+y*y <= 10000000)。
2、
pi = (double)( a / MAX ) * 4.0;
pi = (double)( a / MAX ) * 4.0;由于MAX是10000,a<=9999,所以a永远小于MAX所以(a/MAX)永远等于0,所以你求出的pi值永远等于0。 pi = (double)( a / MAX ) * 4.0等价于pi=(double)(0)*4.0等价于pi=0;在c语言或者c++中两个int型的变量相除结果还是int型的,如果分母大于分子结果则为0,java中好像也是的。但是分子分母中只要有一者是double或floati型的,那个整型会自动向高精度的数据类型转换。所以你的 pi = (double)( a / MAX ) * 4.0;应更正为 pi = a /(double) MAX * 4.0;或者
pi = (double)a/MAX * 4/0;或者把double替换为float也可以滴
在我的机器上最终模拟出的pi的近似值是
# include <stdio.h>
# include <math.h>
main()
{
double pi = 3;
unsigned int i;
for (i=1; i<15; i++)
pi = sqrt(pi) + 2;
pi = sqrt(2 - sqrt(pi));
for (i=0; i<15; i++)
pi *= 2;
pi *= 3;
printf("pi = %.10lf\n", pi);
}
算得 3.1415926453 也算比较精确了