【问题标题】:Constantly getting 0 when trying to compute pi [duplicate]尝试计算 pi 时不断得到 0 [重复]
【发布时间】:2020-07-03 18:55:17
【问题描述】:

我被要求编写一个程序,该程序从用户那里获取 N 个点,并使用连续分布通过 Monte Carlo 技术找到 Pi 的近似值。这是我写的:

        unsigned seed = chrono::steady_clock::now().time_since_epoch().count();
        default_random_engine e (seed);
        uniform_real_distribution<> dist(0,2);
        int N = atoi(argv[1]);
        int inside = 0;
        long double appPi = 0;
        for (int i = 0; i<N; i++){
            double x = dist(e);
            double y = dist(e);
            double distance = sqrt(x*x+y*y);
            if (distance <= 1){ inside++;}
        }
        appPi = (inside/N)*4;

但是,在打印 appPi 后,我得到的只是 0。我认为该算法本身可以吗?因为它打印了 x 和 y 的合理值,但它对我不起作用。

【问题讨论】:

  • int 除以intint
  • 哦,对了。有没有办法把它改成双倍?
  • appPi = (static_cast&lt;double&gt;(inside)/N)*4;
  • 谢谢,这似乎解决了除法的问题,但是我得到了一种奇怪的结果,例如 0.7872,这与真正的 PI 相去甚远。是不是我做错了什么?
  • 为什么要测试分布在 (0,2) 范围内的 x 和 y 值?那不应该是(0,1)吗?此外,如果您认识到如果 sqrt(x*x + y*y)

标签: c++ random montecarlo pi


【解决方案1】:

除了 Xatyrian 指出的整数除法之外,您还缺少乘法因子。您正在提取大小为 l = 2 的正方形中的随机点,然后计算半径为 R = 1 的圆的四分之一中有多少点。如果我们定义这些点的分数 f,我们可以将此值与正方形和四分之一圆的面积联系起来:pi R^2 / 4 = fl^2.

如果我们将这个关系插入上面定义的值,我们会发现 pi = 16 f 而不是 4 f 就像您的代码似乎暗示的那样。事实上,0.7872 * 4 = 3.1488。

比使用 16 而不是 4 更快速、更合理的解决方法是通过进行以下更改来提取大小为 l 的正方形中的点:

uniform_real_distribution<> dist(0,1);

【讨论】:

    猜你喜欢
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多