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

标签 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 似乎是无效参数。我该如何解决?

最佳答案

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>用 bool 值 uniform_int_distribution (即,在 0 和 1 之间进行选择)。您的实际分布应该超过正数,最多为 max。 .每次你从 real 分布中得到一个数字,也从 int 分布中得到一个。如果整数为 1,则取反。

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

关于c++ - std::uniform_real_distribution - 获取所有可能的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38269960/

相关文章:

c++ - 为什么下面的程序用 g++ 编译时会慢 15%?

c++ - 实现完美转发到 std::thread 的函数

c# - 如何在没有调用堆栈的情况下获取异常消息

java - 防止向用户显示任何异常?

c# - 如何在 Windows 设备之间使用相同的随机种子?

java - 在 Netbeans 中显示文件夹中的随机图像到 JLabel

数字输入的 C++ 输入验证

c++ - 为什么数组索引在此程序中不显示交换行为?

java - Android:将可序列化对象传递给 Activity 时出现 ClassNotFoundException

r - 按组替换生成随机数