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

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

本文关键字:数字 C++mt19937      更新时间:2023-10-16

我目前遇到一个问题,我的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函数

好吧,您创建了不同的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';
}

你可以看到它的实时

注意

有些人可能会说,您的代码确实返回了随机数:)