我有一行:
std::uniform_real_distribution<T> distribution(std::numeric_limits<T>::lowest(),
std::numeric_limits<T>::max());
它可以编译,但在Debug(VS 2017CE)上崩溃。根据{{1}}的文档,我的猜测是:
要求
std::uniform_real_distribution
和a ≤ b
当我的b-a ≤ std::numeric_limits<RealType>::max()
是b
而::max()
是a
时,条件:
::lowest()
无法实现,因为b-a ≤ std::numeric_limits<RealType>::max()
的值基本上是b-a
的两倍。有什么办法可以解决这个问题,以便我能保持如此广泛的范围吗? max
可以很好地工作,但是省略了负值。仅浮点数会出现问题。
答案 0 :(得分:10)
至少对于常见的IEEE-754浮点数,一个简单的解决方案是随机翻转随机非负数的符号:
std::uniform_real_distribution<T> distribution(0.,
std::numeric_limits<T>::max());
auto rn = distribution(eng);
return someRandomFlag ? rn : -rn;
其中someRandomFlag
是从{true, false}
中统一选择的。
答案 1 :(得分:5)
执行此操作的一种方法是使用范围[-1, 1]
,然后将其乘以std::numeric_limits<T>::max()
以获取实际数字。这样可以满足b-a ≤ std::numeric_limits<RealType>::max()
的要求。
auto dis = std::uniform_real_distribution<T> dis(-1, std::nextafter(1, std::numeric_limits<T>::max()));
return dis(eng) * std::numeric_limits<T>::max();
这不会为您提供所有可能的浮点值,但可以像uniform_int_distribution
那样为您提供大量的浮点值。