Question

I'm trying to make a program to find approximation of pi. I would like to implement the Buffon's needle method. My program finds the random x coordinate form 0 to 1 and random angle (0 to 360). If [sin(angle)*1/2 lenght of needle] is bigger than x there is a positive trial. The program makes n amonunt of trials in the loop. Last part is to calculate pi using the equation (lenght of needle * n) / positive trials.

lenght of needle = 0.9

interval = 1

The result of n=10000000 is pi=3,12... I can't find any errors in the program. What I'm doing incorrect?

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <math.h>

using namespace std;

int main()
{
    double x; // x coordinate of needle's center 
    double k; // angle between vertical position and needle
    double l; // lenght of the needle
    double n; // amount of trials
    double p = 0; // positive trials
    double y; // sin(angle) * l
    double pi;
    long i; // loop counter

srand(time(NULL));

cout << "number of trials ";
cin >> n;

l = 0.9;

for (i=0; i<n; i++)
{
    k = (double)rand()/(RAND_MAX)*360;       // random angle

    x = (double)rand()/(RAND_MAX*2);         // random x (0 do 1)

    y = (l/2) * sin (k);


    if (x<=y)                                    
    {
        p++;                                    
    }

}

pi = (l*n)/(p);

cout << "n = ";
cout << n << endl;
cout << "p = ";
cout << p << endl;

cout << pi;


return 0;

}

Was it helpful?

Solution

For one, sin takes radians as argument, not degrees, so a random angle should not be between 0 and 360 degrees. I know this because the program

#include <iostream>
#include <cmath>
using namespace std;
int main(void) {
    cout << sin(30) << endl;
    return 0;
}

returns -0.988032, not 0.5.

Furthermore

(double)rand() / (RAND_MAX * 2)

produces a random number between 0 and 0.5, not between 0 and 1. This is because rand() "returns a pseudo-random integral number in the range between 0 and RAND_MAX."

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top