即使在播种时,C ++ mt19937总是给出相同的数字

时间:2015-11-03 15:22:43

标签: c++ random containers

我目前遇到一个问题,即我的RNG总是给我相同的号码 - 即使我每次都在(据说)播种这个值。

该类中的代码是:

    int RandomNumberGenerator()
{
    std::mt19937 engine;
    auto seed = std::chrono::high_resolution_clock::now().time_since_epoch().count();
    engine.seed((unsigned long)seed);
    std::uniform_int_distribution<int> distribution(0, 100);

    return distribution(engine);
}

调用它的代码是:

vector<int> iv;
    generate_n(back_inserter(iv), 5, RandomNumberGenerator);
    cout << "\nVector content: ";
    copy(iv.begin(), iv.end(), ostream_iterator<int>(cout, " "));

每次都是generate_n函数

1 个答案:

答案 0 :(得分:2)

好吧,您创建了n个不同的引擎,并使用时钟值为它们播种。有可能时钟在generate_n()运行的时间内没有移动,并且所有引擎都以相同的值播种。

您应该为生成器播种一次并多次使用它。

改编自uniform_int_distribution

的示例
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <random>
#include <vector>

int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(0, 100);

    std::vector<int> vi;
    std::generate_n(std::back_inserter(vi), 5, std::bind(dis, gen));


    std::copy(begin(vi), end(vi), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';
}

你可以看到它live

注意

Some people may say that your code was indeed returning random numbers:)