我一直认为随机数应该介于0和1之间,即 没有 1
,也就是说,它们是半开区间[0,1]的数字。std::generate_canonical
的 关于 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
叮当3.3
clang++ -stdlib=libc++ -std=c++11 test.c && ./a.out
如果这是正确的行为,我如何避免 1
?
编辑1 : 来自 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 : 我在这里报告了这个行为: < a href = “ https://gcc.gnu.org/bugzilla/show _ bug.cgi? id = 63176”> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63176
编辑3 : clang 团队似乎意识到了这个问题: < a href = “ http://llvm.org/bug/show _ bug.cgi? id = 18767”> http://llvm.org/bugs/show_bug.cgi?id=18767