1

在使用蒙特卡洛的随机方法输入给定的精度以获得“pi”值后,我试图找到实际的精度。假设实际精度的答案应该与给定的精度一样接近。但是当我运行与给定精度完全不接近的程序时,我的实际精度一直在 0.7 左右。我试图看看我的“pi”值是多少,它似乎收敛在 3.11-3.12 左右……真的需要你的帮助……这是我的代码:

#include <iostream>
#include <math.h>
#include <stdlib.h>
#define _USE_MATH_DEFINES

using namespace std;

void values(float *pi, int *P, int *Q)
{
    float x(0), y(0);
    x = (rand()%100)/99.0;
    y = (rand()%100)/99.0;
    if(sqrt((x*x)+(y*y))<=1)
    {
        (*P)++;
    }
    (*Q)++;
    *pi = 4.0*(*P)/(*Q);
}

float get_pi(float required_accuracy)
{
    int D(0), N(0);
    float pi_estimate(0), x(0), y(0), temp(0);
    while(N<=100)
    {
        values(&pi_estimate,&D,&N);
    }

    while(1)
    {
        if(4./(N+1.)<((required_accuracy*0.01)*(pi_estimate)))
        {
            cout<<pi_estimate<<endl;
            return (pi_estimate);
        }
        values(&pi_estimate,&D,&N);
    }
}

int main()
{
    for(float a=0.1;a>=1.e-14;a/=10.)
    {
        cout<<"Actual accuracy : "<<(fabs(get_pi(a) - M_PI)/(M_PI))*100.<<endl;
    }
}
4

3 回答 3

3

您正在使用 100x100 网格上生成随机坐标(rand() % 100) / 99.0。这几乎可以保证你会得到错误的答案。(double)rand()/(double)RAND_MAX是在 [0,1] 中获取随机数的更好方法。

于 2013-10-18T17:35:38.633 回答
2

我认为你应该提高这些数字的准确性:

x = (rand()%100)/99.0;
y = (rand()%100)/99.0;

通过写类似的东西

x = (float)rand()/RAND_MAX;
y = (float)rand()/RAND_MAX;
于 2013-10-18T17:33:37.417 回答
0

如果您使用double了,那会不会有帮助float

于 2013-10-18T17:27:26.323 回答