我想创建一个 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;
}
问题是,当我执行程序时,它被中止了,因为 a
和 b
似乎是无效参数。我该如何解决?
最佳答案
uniform_real_distribution
的构造函数需要:
a ≤ b
andb − a ≤ numeric_limits<RealType>::max()
.
最后一个对你来说是不可能的,因为 lowest
之间的区别和 max
,根据定义,必须大于 max
(而且几乎肯定会是 INF)。
有几种方法可以解决这个问题。正如 Nathan 指出的那样,最简单的方法就是使用 uniform_real_distribution<double>
。 .除非double
对于您的实现,无法存储 float
的范围(并且 IEEE-754 Float64 可以存储 Float32 的范围),这应该可以工作。你仍然会通过 numeric_limits
对于 float
, 但由于分布使用 double
,它可以处理增加范围的数学运算。
或者,您可以组合一个 uniform_real_distribution<float>
用 bool 值 uniform_int_distribution
(即,在 0 和 1 之间进行选择)。您的实际分布应该超过正数,最多为 max
。 .每次你从 real 分布中得到一个数字,也从 int 分布中得到一个。如果整数为 1,则取反。
这样做的缺点是使零的概率略高于其他数字的概率,因为正零和负零是同一回事。
关于c++ - std::uniform_real_distribution - 获取所有可能的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38269960/