投飞镖估算π
题目
“投飞镖”可以近似
解析
这是蒙特卡洛方法的典型应用。原理:
- 在正方形区域内随机投掷点,正方形边长为 2,中心在原点。
- 统计落在单位圆内的点数。
值近似等于:
这是因为单位圆与其外接正方形的面积比为
答案
c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int M;
printf("输入投掷次数:");
scanf("%d", &M);
srand(time(NULL));
int in_circle = 0;
for(int i = 0; i < M; i++) {
// 使用 -1 到 1 的范围以充分利用圆形区域
double x = 2.0 * rand() / RAND_MAX - 1.0;
double y = 2.0 * rand() / RAND_MAX - 1.0;
if(x*x + y*y <= 1) {
in_circle++;
}
}
double pi = 4.0 * in_circle / M;
printf("π ≈ %.6f\n", pi);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25