我一直认为随机数在0和1之间,没有1,即它们是来自半开区间[0,1]的数字.cppreference.com上的文件std::generate_canonical证实了这一点.
但是,当我运行以下程序时:
#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;
}
Run Code Online (Sandbox Code Playgroud)
它给了我以下输出:
Bug!
Run Code Online (Sandbox Code Playgroud)
即它1会让我产生完美,这会导致我的MC集成出现问题.是有效行为还是我身边有错误?这给出了与G ++ 4.7.3相同的输出
g++ -std=c++11 test.c && ./a.out
Run Code Online (Sandbox Code Playgroud)
和铿锵3.3
clang++ -stdlib=libc++ -std=c++11 test.c && ./a.out
Run Code Online (Sandbox Code Playgroud)
如果这是正确的行为,我该如何避免1?
编辑1:来自git的G ++似乎遇到了同样的问题.我在 …