布冯的针C++

Buffon's needle C++

本文关键字:C++ 布冯      更新时间:2023-10-16

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

针长 = 0.9

间隔 = 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;

}

首先,罪恶以弧度作为参数,而不是度数,因此随机角度不应介于 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 之间的伪随机整数"。