我写了以下函数来生成一个随机的双精度向量:
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);
}
在我的main()程序中,如果我尝试在多个向量上调用此函数(比如我想生成10个随机向量),那么我最终得到的所有向量都包含相同的随机数,因为时间不足以获得良好的重新种子。有没有更好的方法来解决这个问题?我应该创建一个随机数组然后再将其转换为向量吗?我习惯于使用matlab,可以只调用X=rand(n,m)...
谢谢!
bind
函数会复制其参数,所以假设你创建了第二个bind
表达式auto generator2 = bind(unif,re);
,你会发现调用generator
和generator2
会产生相同的结果序列。如果你将bind
表达式改为auto generator = bind(unif, ref(re));
,就不会再生成RNG的副本,generator
和generator2
会产生不同的序列。 - Praetorianvoid foo(mt19937& rng)
,而不是void foo(mt19937 rng)
。请查看我发布的链接,其中包含示例用法。 - Praetorian