为什么我的程序不近似Pi

why does my program not approximate pi?

本文关键字:Pi 我的 程序 为什么      更新时间:2023-10-16

我正在尝试编写一个程序,该程序通过使用两个随机数为6/pi^2的概率来近似Pi,因此我应该能够将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;
}

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

int main()
{
    srand(time(0));
    //for (int times = 100; times < 1000; ++times) 
    int times = 1000000;
    {
        double pi_approx, probability;
        int number_of_coprime = 0;
        for (int i = 0; i < times; i++)
        {
            int num1, num2;
            num1 = rand() % times;
            num2 = rand() % times;
            if (__gcd(num1, num2) == 1) // increment if coprime !!
            {
                number_of_coprime++;
            }
        }
        probability = double(number_of_coprime) / double(times);
        pi_approx = sqrt(6 / probability);
        cout << pi_approx << endl;
    }
    return 0;
}

输出是:

3.14179

您在计数错误的东西:当它们为coprime时,应增加计数器(gcd == 1(,但是当GCD为>1。