You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于蒙特卡洛法近似圆周率的精度问题咨询

蒙特卡洛法近似计算圆周率(π)

咱们先理清楚背后的数学逻辑:

  • 假设正方形内有个内切圆,半径为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

火山引擎 最新活动