c - 使用 C 求 pi 的蒙特卡洛方法
问题描述
我编写了一个函数,它接收一个 long long 值n
并将其用作要通过的迭代次数。该函数应该可以很好地估计 pi,但是,所有大的值都n
趋向于 3.000,而不是 3.1415,所以我不确定发生了什么?
有什么我做错了吗?
这是我的代码:
double estimate_pi(long long n){
double randomx, randomy, equation, pi;
long long i, incircle = 0;
for(i = 0; i < n; i++){
randomx = (double)(rand() % (1+1-0) + 0);
randomy = (double)(rand() % (1+1-0) + 0);
equation = randomx * randomx + randomy * randomy;
if(equation <= 1){
incircle++;
}
}
pi = (long double)4 * (long double)incircle / (long double)n;
return pi;
}
在主函数中,打印 10 个 pi 值:
int main(void){
long long N;
double pi_approx;
int i;
printf("Input a value of N: ");
if(scanf("%ld", &N) != 1){
printf("Error, input must be an integer!\n");
exit(EXIT_SUCCESS);
}
if(N < 1){
printf("Error, the integer must be positive!\n");
exit(EXIT_SUCCESS);
}
srand(time(NULL));
for(i = 0; i < 10; i++){
pi_approx = estimate_pi(N);
printf("%.10f\n", pi_approx);
}
return 0;
}
解决方案
它可以正常工作。问题在于实施。
Crand()
函数返回0 到 范围内的整数RAND_MAX
。那里的关键字是integer。
然后,您计算该整数模 2 的结果,它可以是 0 或 1。这会留下 4 个可能的点:(0,0)、(0,1)、(1,0)、(1,1)。
在这 4 个点中,只有 1 个位于半径为 1 的圆之外:(1,1)。也就是说,在 4 个可能的点中,有 3 个位于圆圈中。
您应该替换该代码以使用浮点值,而不是整数,以便计算圆内外点的比例。
推荐阅读
- javascript - node stripe products list return empty
- javascript - 工厂函数中的“This”
- web-scraping - 网络从汤文件中抓取相关信息
- python - Django 模型字段包含奇怪的属性 _("private")
- reactjs - React Router - Route children 和 component props 有什么区别
- java - 如何将大型 JSON 字符串转换为 JSON 对象?
- flutter - 颤振溢出圆圈头像覆盖容器
- html - 如何使用 sed 将 CSS 样式文件内联到 HTML 文件?
- r - 从后验预测分布抽样(stan vs inla)
- html - 反应渲染问题