高性能计算-蒙特卡洛估计圆周率(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 @   安洛8  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示