我正在尝试使用std::uniform_real_distribution<float>(a, b)
生成随机浮点数,我发现输出等于上限b
的情况。根据:
http://www.cplusplus.com/reference/random/uniform_real_distribution
http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution
这不应该发生。
同时使用gcc-4.9.2
和clang-3.5.0
,以下内容会崩溃:
#include <iomanip>
#include <iostream>
#include <limits>
#include <random>
int main() {
float a = 1.0f;
float b = 1.001f;
size_t seed = 293846;
size_t n = 9830;
std::mt19937 rg(seed);
std::uniform_real_distribution< float > u(a, b);
for (size_t i = 0; i < n; ++i) {
float v = u(rg);
if (not (v < b)) {
std::cerr << "error: i=" << i
<< " v=" << std::scientific << std::setprecision(std::numeric_limits< double >::max_digits10) << v
<< " b=" << b << std::endl;
abort();
}
}
}
我看到的输出是:
error: i=9829 v=1.00100004673004150e+00 b=1.00100004673004150e+00
Aborted (core dumped)
这是标准库的错误吗?我错过了什么吗?
修改即可。虽然不完全相同,但这个问题中提出的问题确实包含在此处引用的其他问题的答案中。
有关此问题状态的最多信息是LLVM错误线程:https://llvm.org/bugs/show_bug.cgi?id=18767
答案 0 :(得分:0)
虽然<iframe name="google_conversion_frame"
要求在实数的半开区间内进行均匀分布,但它不包含任何关于如何舍入到浮点表示的语言。
因此,从我能找到的信息来看,合规实现很可能是合法的(并且必需),以产生比较上限的浮点数。