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;
}
问题是当我执行程序时,它被中止了,因为 a
和 b
似乎是无效参数。我该如何解决?
uniform_real_distribution
的构造函数要求:
a ≤ b
and b − 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>
与布尔值 uniform_int_distribution
结合使用(即,在 0 和 1 之间进行选择)。您的实际分布应该超过正数,最多 max
。每次你从 real 分布中得到一个数字,也从 int 分布中得到一个。如果整数为1,则取反实数值。
这样做的缺点是使零的概率略高于其他数字的概率,因为正零和负零是同一回事。
我想创建一个 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>
与布尔值 uniform_int_distribution
结合使用(即,在 0 和 1 之间进行选择)。您的实际分布应该超过正数,最多 max
。每次你从 real 分布中得到一个数字,也从 int 分布中得到一个。如果整数为1,则取反实数值。
这样做的缺点是使零的概率略高于其他数字的概率,因为正零和负零是同一回事。