高性能计算-蒙特卡洛估计圆周率(6)

  1. 源代码
/*
问题:用蒙特卡洛算法估计π的值。在边长为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;
}
  1. 测试结果:当采样数大于10w基本可保证小数点位两位正确度。
posted @ 2024-10-26 14:40  安洛8  阅读(33)  评论(0)    收藏  举报