我被要求编写一个程序,该程序从用户那里获得N分,然后使用连续分布使用蒙特卡洛技术找到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的四分之一圆中有多少点。如果我们定义这些点f的分数,我们可以将此值连接到正方形和四分之一圆的面积:pi R ^ 2/4 = fl ^ 2。
如果将这种关系插入上面定义的值,则会发现pi = 16 f,而不是您的代码似乎暗示的4 f。实际上,0.7872 * 4 = 3.1488。
与使用16而不是4相比,一种快速,更合理的解决方法是通过进行以下更改来提取大小为l的正方形的点:
uniform_real_distribution<> dist(0,1);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句