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

C++ mt19937 always giving same number, even when seeding

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

class中的代码是:

    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 函数

好吧,您创建了 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:)