为什么下面程序中的u
总是无穷无尽?
#include <random>
#include <limits>
int main()
{
auto seed = std::random_device()();
std::mt19937 randomEngine(seed);
const double lo = std::numeric_limits<double>::lowest(); // ~= -1.8e+308
const double hi = std::numeric_limits<double>::max(); // ~= 1.8e+308
std::uniform_real_distribution<> U(lo, hi);
double u = U(randomEngine); // always 1.#INF000000000000
return 0;
}
这显然与传递给std::uniform_real_distribution
的范围有关。如果我通过它(lo,0)
或(0,hi)
它会生成有限的随机数,但为什么?
答案 0 :(得分:19)
根据N3797:
26.5.8.2.2 [rand.dist.uni.real]
2需要:
a ≤ b
和b − a ≤ numeric_limits<RealType>::max()
。
由于b - a
为2 * numeric_limits<double>::max()
,因此无法满足此条件。