考虑以下最小示例:
#include <random>
#include <iostream>
int main (const int argC, char* argV[] ) {
std::uniform_real_distribution<double> dist(std::numeric_limits<double>::lowest(), std::numeric_limits<double>::max());
std::random_device gen;
std::cout << dist(gen) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望该程序基本上可以打印double. 但是在我的机器上,输出总是inf. 如果我替换double为float.
我可以很容易地想象这是如何通过错误的实现而发生的std::uniform_real_distribution,例如,绘制数字的间隔长度不能表示为double. 但是我的问题是,这确实是我的标准库实现中的错误,还是我错过了 C++ 标准允许的间隔的一些限制?
a 的要求之一uniform_real_distribution是两个边界之间的差小于std::numeric_limits<double>::max()。所以你的尝试是错误的。
作为一种解决方法,您可以将其拆分为两个生成器,一个用于负数,另一个用于非负数。随机选择两个生成器之一。
请记住,范围的上限不能作为生成的数字返回。