投针估算π
题目
“投针”可以近似
解析
布丰投针问题的数学原理:
- 设针长为
,平行线间距为 - 针与任意一条线相交的概率为
- 当
时, ,其中: 是投掷总次数 是相交次数
判断相交的条件:针中点到最近平行线的距离
证明
设针中点到最近平行线的距离为
在 上均匀分布 在 上均匀分布- 相交概率为:
答案
c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
int main(void) {
int M;
printf("输入投掷次数:");
scanf("%d", &M);
srand(time(NULL));
int cross = 0;
const double d = 1.0; // 线间距
const double l = 1.0; // 针长
for(int i = 0; i < M; i++) {
// y 是针中点到最近线的距离
double y = (double)rand() / RAND_MAX * (d/2);
// theta 是针与线的夹角
double theta = (double)rand() / RAND_MAX * M_PI;
// 判断是否相交
if(y <= (l/2) * sin(theta)) {
cross++;
}
}
double pi = 2.0 * M / cross;
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
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31