- 源代码
/*
问题:用蒙特卡洛算法估计π的值。在边长为r的正方形中画内切圆,
随机N个点,用圆内的点占正方形内所有点数量的比例估计圆的面积,
计算估计的π的值。
*/
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <mpi.h>
#include <stdlib.h>
#define N 100000000 //生成随机点数量
#define NP 4 //并行进程数
#define r 0.5 //圆的半径
int main(int argc,int* argv[])
{
int pid;
double pi=0.0;
unsigned long countAll=N,countP=0;
double arr[N] = {0};
//double arrX[N/NP] = {0};
//double arrY[N/NP] = {0};
MPI_Init(NULL,NULL);
MPI_Comm_rank(MPI_COMM_WORLD,&pid);
//随机数据
srand(time(0)+pid);
for(int i=0;i<N/NP;i++)
{
double x = 1.0*(rand()%RAND_MAX)/RAND_MAX;
double y = 1.0*(rand()%RAND_MAX)/RAND_MAX;
//printf("x:%lf, y:%lf\n",x,y);
if((pow(x-r,2)+pow(y-r,2))<=pow(r,2))
countP++;
}
//规约数据
MPI_Reduce(&countP,&countAll,1,MPI_UNSIGNED_LONG,MPI_SUM,0,MPI_COMM_WORLD);
if(0==pid)
{
pi= (double)4.0*countAll/N;
printf("估计π值为:%lf\n",pi);
}
MPI_Finalize();
return 0;
}
- 测试结果:当采样数大于10w基本可保证小数点位两位正确度。