【问题标题】:On the full double range std::uniform_real_distribution always returns inf在全双精度范围内,std::uniform_real_distribution 总是返回 inf
【发布时间】:2020-09-27 23:22:53
【问题描述】:

考虑以下最小示例:

#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++11 random


    【解决方案1】:

    uniform_real_distribution 的要求之一是两个边界之间的差异小于std::numeric_limits&lt;double&gt;::max()。所以你的尝试是错误的。

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

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

    【讨论】:

    • @NateEldredge 在 N4849(C++20 草案)中,构造函数的描述(第 26.6.8.2.2 节第 1 节)将其列为要求。
    • 哦,它也是 C++17 的,26.5.8.2.2 (2)。
    猜你喜欢
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    相关资源
    最近更新 更多