使用蒙特卡罗方法计算PI给出了不精确的答案

Abr*_*chi 3 c pi

我试图用蒙特卡罗方法计算PI.无论MAXLEN有多大,我的代码都会给出结果3.000.经过多次调试后,我无法得到我做错的事.

#include <stdio.h>
#include <stdlib.h>

#define sqr2(x) ((x)*(x))
#define frand() ((double) rand() / (RAND_MAX))
#define MAXLEN 1000


int circumscribed(int radius){
    float xcoord = frand();
    float ycoord = frand(); 
    float coord = sqr2(xcoord) + sqr2(ycoord);

    if(coord <= radius)
        return 1;
    return -1;      
}

int main()
{
    int i;
    int circles = 0, rect = 0;;
    for(i = 0; i < MAXLEN; i++)
    {
        if(circumscribed(1) > 0)   // if(circumscribed(1)) shoul be enough but it doesn't work. Very odd in my opinion.
            circles++;
        rect++;  //this is equal to MAXLEN, I just used it for debugging
    }

    float PI = 4 * circles / rect;
    printf("PI is %2.4f: \n", PI);
    return 0;   
}
Run Code Online (Sandbox Code Playgroud)

Bil*_*ard 5

由于circlesrect都是int,结果4 * circles / rect将是一个int.请改用浮点数.

float PI = 4.0 * (float)circles / rect;
Run Code Online (Sandbox Code Playgroud)