首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >1.0是std::generate_canonical的有效输出吗?

1.0是std::generate_canonical的有效输出吗?
EN

Stack Overflow用户
提问于 2014-09-04 22:51:52
回答 2查看 6.4K关注 0票数 124

我一直认为随机数应该在0和1之间,没有1,的,即它们是来自半开区间[0,1]的数字。std::generate_canonicaldocumention on cppreference.com证实了这一点。

但是,当我运行以下程序时:

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

int main()
{
    std::mt19937 rng;

    std::seed_seq sequence{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    rng.seed(sequence);
    rng.discard(12 * 629143 + 6);

    float random = std::generate_canonical<float,
                   std::numeric_limits<float>::digits>(rng);

    if (random == 1.0f)
    {
        std::cout << "Bug!\n";
    }

    return 0;
}

它给出了以下输出:

Bug!

也就是说,它为我生成了一个完美的1,这会导致我的MC集成出现问题。这是有效的行为,还是我这边有错误?这将产生与G++ 4.7.3相同的输出

g++ -std=c++11 test.c && ./a.out

和clang 3.3

clang++ -stdlib=libc++ -std=c++11 test.c && ./a.out

如果这是正确的行为,我如何避免1

Edit1:git的G++似乎也有同样的问题。我上线了

commit baf369d7a57fb4d0d5897b02549c3517bb8800fd
Date:   Mon Sep 1 08:26:51 2014 +0000

而使用~/temp/prefix/bin/c++ -std=c++11 -Wl,-rpath,/home/cschwan/temp/prefix/lib64 test.c && ./a.out编译则会产生相同的输出,ldd会产生

linux-vdso.so.1 (0x00007fff39d0d000)
libstdc++.so.6 => /home/cschwan/temp/prefix/lib64/libstdc++.so.6 (0x00007f123d785000)
libm.so.6 => /lib64/libm.so.6 (0x000000317ea00000)
libgcc_s.so.1 => /home/cschwan/temp/prefix/lib64/libgcc_s.so.1 (0x00007f123d54e000)
libc.so.6 => /lib64/libc.so.6 (0x000000317e600000)
/lib64/ld-linux-x86-64.so.2 (0x000000317e200000)

编辑2:我在这里报告了该行为:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63176

编辑3:clang团队似乎意识到了这个问题:http://llvm.org/bugs/show_bug.cgi?id=18767

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25668600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档