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);
}