布冯的针C ++

时间:2012-12-09 20:15:12

标签: c++ pi

我正在尝试制作程序以找到pi的近似值。我想实现布冯的针法。我的程序找到随机x坐标形式0到1和随机角度(0到360)。如果[sin(角度)* 1/2针长度]大于x,则进行阳性试验。该程序使循环中的试验成为可能。最后一部分是使用方程式(针* n的长度)/阳性试验来计算pi。

针的长度= 0.9

interval = 1

n = 10000000的结果是pi = 3,12 ...我在程序中找不到任何错误。我做错了什么?

#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;

}

1 个答案:

答案 0 :(得分:5)

首先,sin将弧度视为参数,而不是度数,因此随机角度不应介于0到360度之间。我知道这是因为程序

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

返回-0.988032,而不是0.5。

此外

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

产生一个介于0和0.5之间的随机数,而不是介于0和1之间。这是因为rand()“返回0到RAND_MAX范围内的伪随机整数。”