尝试计算 pi 时不断得到 0
Constantly getting 0 when trying to compute pi
我被要求编写一个程序,从用户那里获取 N 个点,并使用连续分布使用 Monte Carlo 技术找到 Pi 的近似值。这是我写的:
unsigned seed = chrono::steady_clock::now().time_since_epoch().count();
default_random_engine e (seed);
uniform_real_distribution<> dist(0,2);
int N = atoi(argv[1]);
int inside = 0;
long double appPi = 0;
for (int i = 0; i<N; i++){
double x = dist(e);
double y = dist(e);
double distance = sqrt(x*x+y*y);
if (distance <= 1){ inside++;}
}
appPi = (inside/N)*4;
然而在打印appPi之后我得到的是0。我认为这个算法本身是可以的?因为它打印出合理的 x 和 y 值,但它对我来说并不适用。
除了 Xatyrian 指出的整数除法外,您还缺少乘法因子。您在大小为 l = 2 的正方形中提取随机点,然后计算半径为 R = 1[= 的四分之一圆中有多少点24=]。如果我们定义这些点的分数 f 我们可以将这个值连接到正方形和四分之一圆的面积:pi R^2 / 4 = f l ^2.
如果我们将上面定义的值插入此关系中,我们会发现 pi = 16 f 而不是 4 f,因为您的代码似乎意味着。事实上,0.7872 * 4 = 3.1488.
比使用 16 而不是 4 更快速、更合理的解决方法是通过进行以下更改来提取大小为 l 的正方形中的点:
uniform_real_distribution<> dist(0,1);
我被要求编写一个程序,从用户那里获取 N 个点,并使用连续分布使用 Monte Carlo 技术找到 Pi 的近似值。这是我写的:
unsigned seed = chrono::steady_clock::now().time_since_epoch().count();
default_random_engine e (seed);
uniform_real_distribution<> dist(0,2);
int N = atoi(argv[1]);
int inside = 0;
long double appPi = 0;
for (int i = 0; i<N; i++){
double x = dist(e);
double y = dist(e);
double distance = sqrt(x*x+y*y);
if (distance <= 1){ inside++;}
}
appPi = (inside/N)*4;
然而在打印appPi之后我得到的是0。我认为这个算法本身是可以的?因为它打印出合理的 x 和 y 值,但它对我来说并不适用。
除了 Xatyrian 指出的整数除法外,您还缺少乘法因子。您在大小为 l = 2 的正方形中提取随机点,然后计算半径为 R = 1[= 的四分之一圆中有多少点24=]。如果我们定义这些点的分数 f 我们可以将这个值连接到正方形和四分之一圆的面积:pi R^2 / 4 = f l ^2.
如果我们将上面定义的值插入此关系中,我们会发现 pi = 16 f 而不是 4 f,因为您的代码似乎意味着。事实上,0.7872 * 4 = 3.1488.
比使用 16 而不是 4 更快速、更合理的解决方法是通过进行以下更改来提取大小为 l 的正方形中的点:
uniform_real_distribution<> dist(0,1);