如何使用 std::mt19937 避免相同的随机结果

How to avoid same random results using std::mt19937?

本文关键字:随机 结果 何使用 std mt19937      更新时间:2023-10-16

我下面的代码受到线程"std::mt19937 需要预热吗?"的影响。执行时,生成两个具有相同内容的向量,这不是我想要的。我预计两个向量中都有不同的内容。我做错了什么以及如何解决它?

输出:

0.251423
0.729274
-1.43542
0.251423
0.729274
-1.43542

法典:

#include <vector>
#include <algorithm>
#include <iostream>
#include <random>
#include <array>
#include <functional>
#include <iterator>
class functor1
{
public:
  functor1()
  {
    std::random_device device;
    std::array<int, std::mt19937::state_size> seeds;
    std::generate_n(seeds.data(), seeds.size(), std::ref(device));
    std::seed_seq sequence(std::begin(seeds), std::end(seeds));
    engine.seed(sequence);
  }
  double operator()()
  {
    std::normal_distribution<double> distribution(0.0, 1.0);
    return distribution(engine);
  }
private:
  std::mt19937 engine;
};
int main()
{
    functor1 f1;
    std::vector<double> v0;
    std::vector<double> v1;
    std::generate_n(std::back_inserter(v0), 3, f1);
    std::generate_n(std::back_inserter(v1), 3, f1);
    std::ostream_iterator<double> out(std::cout, "n");
    std::copy(v0.begin(), v0.end(), out);
    std::copy(v1.begin(), v1.end(), out);
}

谢谢

这是因为f1被复制到generate_n()函数调用中。改用std::ref(f1),它将为 v0v1 返回不同的结果:

std::generate_n(std::back_inserter(v0), 3, std::ref(f1));
std::generate_n(std::back_inserter(v1), 3, std::ref(f1));