为什么我的程序不接近pi?

时间:2018-03-26 05:32:30

标签: c++ math random probability montecarlo

我试图写,通过使用概率近似于PI一个程序,两个随机数互质,其是6 / PI ^ 2,所以我应该能够aproximate pi作为SQRT(6 /概率),但由于某种原因它不倾向于pi而不是似乎倾向于3.912。我已经尝试了rand()函数,我尝试了mersenne twister随机数生成器,但他们都给了我类似的结果。这是怎么回事?这是我在c ++中的代码

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
#include <algorithm>

using namespace std;

int main()
{
    srand(time(0));
    int times;

    cout << "enter number of times: ";
    cin >> times;

    for(int i = 0; i <= times; i ++)
    {
        double pi_approx, probability;
        int num1, num2, number_of_coprime;
        num1 = rand();
        num2 = rand();
        if(__gcd(num1, num2)>1)
        {
           number_of_coprime++;
        }

        probability = double(number_of_coprime)/double(i);
        pi_approx = sqrt(6/probability);

        cout <<100*i/times<< "% number of coprimes: "<< number_of_coprime << " pi approximation: " << pi_approx<<endl;

    }

    return 0;
}

2 个答案:

答案 0 :(得分:2)

你需要在适当的范围内声明变量,正确的公式是随着次数变为无穷大,概率变为6 / pi ^ 2。请尝试以下代码:

inline-block

输出是:

  

3.14179

答案 1 :(得分:1)

你在计算错误的东西:你应该在它们是互质的时候增加计数器(gcd == 1),但是当gcd是&gt;时你增加。 1。