关于蒙特卡洛法近似圆周率的精度问题咨询
蒙特卡洛法近似计算圆周率(π)
咱们先理清楚背后的数学逻辑:
- 假设正方形内有个内切圆,半径为R:
- 圆的面积计算公式是:
圆的面积 = π * R² - 正方形的边长是2R,所以面积为:
正方形的面积 = (2R)² = 4 * R²
- 圆的面积计算公式是:
- 把圆的面积除以正方形的面积,得到的比值是
π/4,反过来就能推导出近似计算π的公式:π = 4 * (圆内点数 / 正方形内总点数)
这个方法的核心就是蒙特卡洛抽样:在正方形范围内生成大量随机坐标点,统计落在圆内的点数和总的抽样点数,代入上面的公式就能得到π的近似值——抽样点越多,结果越接近真实的π值。
下面是用C++实现这个思路的示例代码:
#include <iostream> /* std::cout */ #include <iomanip> /* std::setprecision */ #include <cstdlib> /* std::rand, std::srand */ #include <ctime> /* std::time */ int main() { std::srand(std::time(nullptr)); // 初始化随机数种子 const int total_points = 1000000; // 设置总抽样点数 int points_in_circle = 0; for (int i = 0; i < total_points; ++i) { // 生成[-1,1)范围内的随机坐标x、y(对应中心在原点、边长为2的正方形) double x = static_cast<double>(std::rand()) / RAND_MAX * 2 - 1; double y = static_cast<double>(std::rand()) / RAND_MAX * 2 - 1; // 判断点是否在单位圆内(满足x² + y² ≤ 1) if (x*x + y*y <= 1) { points_in_circle++; } } double pi_approx = 4.0 * points_in_circle / total_points; std::cout << "近似圆周率值:" << std::setprecision(10) << pi_approx << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者Ziezi




