相关疑难解决方法(0)

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

我一直认为随机数在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 ++似乎遇到了同样的问题.我在 …

c++ random c++11

124
推荐指数
2
解决办法
6088
查看次数

标签 统计

c++ ×1

c++11 ×1

random ×1