布冯的针C++
Buffon's needle C++
我正在尝试制作一个程序来查找圆周率的近似值。我想实施布冯针法。我的程序找到随机 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 之间的伪随机整数"。
相关文章:
- 使用莱布尼茨公式的 Pi 近似
- 曼德布洛特 从一个线程被反复使用变为两个线程
- 为什么我的石头剪刀布游戏不起作用?
- 曼德布洛特切片图像以提高速度
- 石头剪刀布程序
- 石头剪刀布(C++)
- 曼德布洛特集合在大O表示法方面的时间复杂度
- 石头剪刀布的麻烦
- C++中的石头剪刀布循环方法
- 随机在石头剪刀布游戏中在C++
- 渲染 OpenGL 中的曼德布洛特集
- 我同时使用了莱布尼茨和瓦利斯公式来估算π但输出数字错误,我不知道我哪里出错了
- 石头剪刀布游戏 c++
- 布冯的针C++
- 如何删除重复字段中的任意对象?(普罗托布夫)
- C++曼德布洛特程序不会产生正确的输出
- 明下窗户里的普罗托布夫
- 需要澄清布隆和后处理(DirectX 10 / 11)
- 如何使用冯诺依曼邻域在 3D 空间中设置索引
- 计算莱布尼茨求和的迭代次数,用于π C++