【问题标题】:c++ bug in uniform real distribution? [duplicate]均匀真实分布中的c ++错误? [复制]
【发布时间】:2016-02-05 14:19:18
【问题描述】:

我正在尝试使用std::uniform_real_distribution<float>(a, b) 生成随机浮点数,我发现输出等于上限b 的情况。根据: http://www.cplusplus.com/reference/random/uniform_real_distribution http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution 这不应该发生。

对于gcc-4.9.2clang-3.5.0,我会出现以下崩溃:

#include <iomanip>
#include <iostream>
#include <limits>
#include <random>

int main() {
    float a = 1.0f;
    float b = 1.001f;
    size_t seed = 293846;
    size_t n = 9830;
    std::mt19937 rg(seed);
    std::uniform_real_distribution< float > u(a, b);
    for (size_t i = 0; i < n; ++i) {
        float v = u(rg);
        if (not (v < b)) {
            std::cerr << "error: i=" << i
                      << " v=" << std::scientific << std::setprecision(std::numeric_limits< double >::max_digits10) << v
                      << " b=" << b << std::endl;
            abort();
        }
    }
}

我看到的输出是:

error: i=9829 v=1.00100004673004150e+00 b=1.00100004673004150e+00
Aborted (core dumped)

这是标准库的错误吗?我错过了什么吗?

编辑。虽然不是完全重复,但此问题中提出的问题确实已包含在此处引用的其他问题的答案中。

有关此问题状态的最详细信息是此处的 LLVM 错误线程:https://llvm.org/bugs/show_bug.cgi?id=18767

【问题讨论】:

  • 我不是每天都看到 C 程序员使用 not 而不是 ! ;)
  • @Lapshin:我对这种做法意见不一。一方面,关键字逻辑很好,但另一方面,十年不使用它们使它们显得格格不入。
  • @Hurkyl 我并不反对,实际上就像这里它更具可读性,但仍然。
  • 在我的机器上复制的一个案例。确实是个好问题!
  • 这是generate_canonical&lt;float&gt;问题的另一种表现。

标签: c++ gcc stl clang standard-library


【解决方案1】:

虽然[rand.dist.uni.real] 要求在实数的半开区间上均匀分布,但它不包含任何关于如何将这些四舍五入为浮点表示的语言。

所以从我能找到的信息来看,一个符合要求的实现产生比较等于上限的浮点数很可能是合法的(并且要求)。

【讨论】:

  • 我喜欢你的回答,但标准仍然是 a &lt;= x &lt; b,这部分让我无法同意你的看法......
猜你喜欢
  • 2015-08-14
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 2014-10-24
  • 2012-10-11
  • 2011-04-04
  • 2021-12-28
  • 2016-05-09
相关资源
最近更新 更多