首页 > 解决方案 > 在全双精度范围内,std::uniform_real_distribution 总是返回 inf

问题描述

考虑以下最小示例:

#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;
}

我希望程序基本上可以打印double. 但是在我的机器上,输出始终是inf. double如果我替换为也是如此float

我可以很容易地想象出这种情况是如何由于 的错误实现而发生的std::uniform_real_distribution,例如,从中提取数字的间隔长度不能表示为double. 但是我的问题是,这确实是我的标准库实现中的一个错误,还是我错过了 C++ 标准允许的间隔的一些限制?

标签: c++c++11random

解决方案


对 a 的要求之一uniform_real_distribution是两个边界之间的差小于std::numeric_limits<double>::max()。所以你的尝试是不正确的。

作为一种解决方法,您可以将其拆分为两个生成器,一个用于负数,一个用于非负数。随机选择两个生成器之一。

请记住,范围的上限不能作为生成的数字返回。


推荐阅读