【发布时间】:2020-07-03 18:55:17
【问题描述】:
我被要求编写一个程序,该程序从用户那里获取 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 的合理值,但它对我不起作用。
【问题讨论】:
-
int除以int是int -
哦,对了。有没有办法把它改成双倍?
-
appPi = (static_cast<double>(inside)/N)*4; -
谢谢,这似乎解决了除法的问题,但是我得到了一种奇怪的结果,例如 0.7872,这与真正的 PI 相去甚远。是不是我做错了什么?
-
为什么要测试分布在 (0,2) 范围内的 x 和 y 值?那不应该是(0,1)吗?此外,如果您认识到如果 sqrt(x*x + y*y)
标签: c++ random montecarlo pi