使用<random>和函数生成随机双向量

icu*_*ys1 2 c++ random c++11

我编写了以下函数来生成双精度的随机向量:

void getrands(vector<double> *x)
{
  int N=(*x).size();
  uniform_real_distribution<double> unif(0.0,1.0);
  mt19937 re(time(NULL));
  auto generator = bind(unif,re);
  generate_n((*x).begin(),N,generator);
}
Run Code Online (Sandbox Code Playgroud)

在我的main()程序中,如果我尝试在几个向量上调用此函数(假设我想生成10个随机向量),我最终得到的所有向量都包含相同的随机数,因为没有足够的时间来获取一个好的重播种子.有什么更好的方法呢?我应该创建一个随机数组然后将其转换为向量?我已经习惯了matlab,我可以调用X = rand(n,m)......

谢谢!

Pra*_*ian 5

更好的方法是使用随机数生成器播种std::random_device.

mt19937 re(std::random_device{}());
Run Code Online (Sandbox Code Playgroud)

您应该将RNG作为参数传递给函数,而不是每次迭代都创建一个新实例.

另外,请注意std::bind复制其参数,因此您可能希望在将RNG std::ref作为参数传递之前将其包装bind.


我将你的功能重写为

template<typename Generator>
void getrands(vector<double>& x, Generator& gen, unsigned num)
{
  generate_n(std::back_inserter(x), num, std::ref(gen));
}
Run Code Online (Sandbox Code Playgroud)

并称之为

uniform_real_distribution<double> unif(0.0,1.0);
mt19937 re(std::random_device{}());
auto generator = bind(unif, std::ref(re));

vector<double> vs;

getrands(vs, generator, 10);
Run Code Online (Sandbox Code Playgroud)

这允许您重用相同的RNG,在调用函数之前无需将向量设置为正确的大小,并且可以根据需要向向量添加值.

现场演示