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

std::uniform_real_distribution - get all possible numbers

我想创建一个 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 似乎是无效参数。我该如何解决?

uniform_real_distribution 的构造函数要求:

a ≤ b and b − a ≤ numeric_limits<RealType>::max().

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

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

或者,您可以将 uniform_real_distribution<float> 与布尔值 uniform_int_distribution 结合使用(即,在 0 和 1 之间进行选择)。您的实际分布应该超过正数,最多 max。每次你从 real 分布中得到一个数字,也从 int 分布中得到一个。如果整数为1,则取反实数值。

这样做的缺点是使零的概率略高于其他数字的概率,因为正零和负零是同一回事。