std :: uniform_real_distribution - 获取所有可能的数字

时间:2016-07-08 15:07:26

标签: c++ exception random limits

我想创建一个std::uniform_real_distribution能够生成[MIN_FLOAT, MAX_FLOAT]范围内的随机数。以下是我的代码:

#include <random>
#include <limits>
using namespace std;

int main()
{
    const auto a = numeric_limits<float>::lowest();
    const auto b = numeric_limits<float>::max();
    uniform_real_distribution<float> dist(a, b);
    return 0;
}

问题在于,当我执行程序时,它被中止,因为ab似乎是无效的参数。我该如何解决?

1 个答案:

答案 0 :(得分:4)

uniform_real_distribution的构造函数需要:

  

a ≤ bb − a ≤ numeric_limits<RealType>::max()

最后一个对您来说是不可能的,因为根据定义,lowestmax之间的差异必须大于max(并且几乎肯定是INF)。< / p>

有几种方法可以解决这个问题。内森指出,最简单的就是使用uniform_real_distribution<double>。除非你的实现double无法存储float的范围(并且IEEE-754 Float64可以存储Float32的范围),否则这应该有效。您仍然会为numeric_limits传递float,但由于分发使用double,因此它可以处理增加范围的数学运算。

或者,您可以将uniform_real_distribution<float>与布尔uniform_int_distribution(即在0和1之间选择的一个)组合在一起。您的实际分布应该是正数,最多为max。每次从真实发行版中获取数字时,也要从int发行版中获取一个数字。如果整数是1,则否定实际值。

这使得零概率略低于其他数字概率的缺点,因为正零和负零是相同的。