pta圆周率计算(蒙特卡洛算法)
时间: 2025-06-22 11:45:49 浏览: 18
### 使用蒙特卡洛方法计算圆周率
为了利用蒙特卡洛方法估算圆周率 π 的值,可以通过模拟向单位正方形内随机投点并判断这些点是否落在该正方形内的单位圆中来完成。假设有一个边长为 2 的正方形及其内部的一个半径为 1 的圆形,则圆的面积与正方形面积之比等于 π/4。
当大量重复这一过程时,落入圆中的点的数量除以总点数近似于上述比例。因此,π 可由下述关系得出:
\[ \pi = 4 * (\text{位于圆内的点数量} / \text{总的点数量}) \]
下面给出 Python 和 C 两种编程语言下的具体实现方式。
#### Python 实现
```python
import random
def estimate_pi(num_samples):
inside_circle = 0
for _ in range(num_samples):
x, y = random.uniform(-1, 1), random.uniform(-1, 1)
if x ** 2 + y ** 2 <= 1:
inside_circle += 1
pi_estimate = (inside_circle / num_samples) * 4
return pi_estimate
num_samples = 1000000 # 抽样次数越多越接近真实值
print(f'Estimated Pi value is {estimate_pi(num_samples)}')
```
这段代码定义了一个名为 `estimate_pi` 函数接收参数 `num_samples` 表示抽样的样本量大小。函数体内循环执行指定次数,在每次迭代过程中生成两个介于 -1 到 1 之间的浮点数作为坐标位置,并检查它们是否满足条件 \(x^{2}+y^{2}\leqslant 1\) 来决定是否计入圆内计数器。最后返回根据公式得到的结果[^2]。
#### C 实现
对于 C 版本来说,考虑到精度问题以及可能存在的溢出风险,这里采用双精度浮点数代替单精度浮点数来进行运算。
```c
#include <stdio.h>
#include <stdlib.h>
int main(){
unsigned long n;
double x,y,dist,pie=0.0;
printf("Enter number of iterations: ");
scanf("%lu",&n);
srand(time(NULL));
for(unsigned long i=0;i<n;++i){
x=(double)(rand()%RAND_MAX)/RAND_MAX*2-1;
y=(double)(rand()%RAND_MAX)/RAND_MAX*2-1;
dist=x*x+y*y;
if(dist<=1)predicate++;
}
pie=((double)predicate/(double)n)*4;
printf("Pi estimated as %.8lf\n",pie);
return 0;
}
```
在这个版本里,先让用户输入想要尝试多少次实验(即迭代次数),之后初始化种子以便获得不同的随机序列。接着在一个大循环里面不断产生新的坐标对直到达到设定的最大次数为止;每一轮都检验新产生的坐标的距离平方是否小于等于一,如果是的话就增加命中次数。最终输出所估计出来的 π 值[^3]。
阅读全文
相关推荐


















