uniform_real_distribution不包含右端。这意味着不可能找到一种方法来生成E = 0的随机数。如何创建一个开放间隔或封闭间隔而不是半开放的uniform_real_distribution

有人可能会说,偏向负值并不重要,因为差异很小,但仍然不完全正确。

最佳答案

您可以将 std::uniform_real_distribution std::nextafter 结合使用:

template <typename RealType = double>
auto make_closed_real_distribution(RealType a = 0.0, RealType b = 1.0) {
    return std::uniform_real_distribution<RealType>(
        a, std::nextafter(b, std::numeric_limits<RealType>::max()));
}

经过一些查找,这实际上是在en.cppreference上提出的方法。

如果要打开间隔,只需在第一个参数上使用nextafter():
template <typename RealType = double>
auto make_open_real_distribution(RealType a = 0.0, RealType b = 1.0) {
    return std::uniform_real_distribution<RealType>(
        std::nextafter(a, std::numeric_limits<RealType>::max()), b);
}

09-12 20:51