为什么<random>库每次使用std :: uniform_int_distribution时都会产生相同的结果

时间:2016-01-08 15:44:20

标签: c++ c++11 random compiler-errors

注意:

  1. 我的编译器是g ++ 5.1.0-2,带有c ++ 14语言标准
  2. 我的IDE是Code :: Blocks(我也试过Dev-C ++上的代码)
  3. 我测试代码的在线IDE是http://cpp.sh/(C ++ shell)和https://www.codechef.com/ide(CodeChef.com的IDE)都运行c ++ 14
  4. 使用在线IDE时代码运行正常,这让我更加困惑。
  5. 以下是代码:

    #include <iostream>
    #include <random>
    #include <cstdlib>
    #include <ctime>
    #include <chrono>
    
    int main() {
        srand(time(0));
        long long seed = rand();
        std::default_random_engine rand_num(seed);
        std::uniform_int_distribution<long long> range(0, 10);
        long long a = range(rand_num);
        long long b = rand_num();
        std::cout<<seed<<"\n"; // the seed is different every time (tested)
        std::cout<<a<<"\n";
        std::cout<<b<<"\n";
        system("pause");
        return 0;
    }
    

    使用std :: uniform_int_distribution(a)的那个在我自己的计算机上运行代码时不是随机的,但是可以正常工作并在在线IDE上创建一个随机数。

    没有std :: uniform_int_distribution(b)的人可以使用在线IDE和我自己的计算机。

    有什么问题?我该如何解决?

    更新:代码与mt19937引擎(std :: mt19937和std :: mt19937_64)正常工作

2 个答案:

答案 0 :(得分:2)

这似乎是Windows上g ++实现的已知问题。查看类似问题的已接受答案:Why do I get the same sequence for every run with std::random_device with mingw gcc4.8.1?

为避免此问题,您可以使用<chrono>工具为随机数生成器播种:

#include <iostream>
#include <random>
#include <cstdlib>
#include <ctime>
#include <chrono>

int main() {
    srand(time(0));
    long long seed = rand();

    std::default_random_engine rand_num{static_cast<long unsigned int>(std::chrono::high_resolution_clock::now().time_since_epoch().count())};
    //                                  ^ ^ ^ ^ ^ ^^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
    std::uniform_int_distribution<long long> range{1,10};

    long long a = range(rand_num);
    long long b = rand_num();
    std::cout<<seed<<"\n"; // the seed is different every time (tested)
    std::cout<<a<<"\n";
    std::cout<<b<<"\n";
    system("pause");
    return 0;
}

这给了我每次运行时的不同结果(在Windows上使用g ++)。

答案 1 :(得分:1)

您的代码在Visual C ++中运行良好,但g ++ 5.2.0对我来说失败了。它看起来像是gcc标准库中的一个错误。

更多证据表明使用default_random_engine一般来说只是一个坏主意,并且使用time(0)作为种子也非常糟糕(尽管快速检查表明将其更改为使用{{种子的1}}仍会产生破碎的结果。)