我想创建一个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
似乎是无效的参数。我该如何解决?
答案 0 :(得分:4)
uniform_real_distribution
的构造函数需要:
a ≤ b
和b − a ≤ numeric_limits<RealType>::max()
。
最后一个对您来说是不可能的,因为根据定义,lowest
和max
之间的差异必须大于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,则否定实际值。
这使得零概率略低于其他数字概率的缺点,因为正零和负零是相同的。