Uniform_real不接受numeric_limits :: lowest()

时间:2018-08-27 12:12:11

标签: c++ c++11 random

我有一行:

std::uniform_real_distribution<T> distribution(std::numeric_limits<T>::lowest(), 
                                               std::numeric_limits<T>::max());

它可以编译,但在Debug(VS 2017CE)上崩溃。根据{{​​1}}的文档,我的猜测是:

  

要求std::uniform_real_distributiona ≤ b

当我的b-a ≤ std::numeric_limits<RealType>::max()b::max()a时,条件:

  

::lowest()

无法实现,因为b-a ≤ std::numeric_limits<RealType>::max()的值基本上是b-a的两倍。有什么办法可以解决这个问题,以便我能保持如此广泛的范围吗? max可以很好地工作,但是省略了负值。仅浮点数会出现问题。

2 个答案:

答案 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那样为您提供大量的浮点值。