犰狳产生相同的随机数

Ale*_*vin 2 random armadillo

我使用cygwin64(或minGW)下的Armadillo软件包(v.7.300.1)生成带有randoms的矩阵:

#include<armadillo>

int main(){
  arma::mat(3,3, arma::fill::randu).print();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序(重新构建或重新运行后)始终生成:

0.6900  0.5548  0.2074    
0.5054  0.3784  0.6263    
0.5915  0.2577  0.3401
Run Code Online (Sandbox Code Playgroud)

为什么总是一样的?怎么了?

Dir*_*tel 9

你忘了设置种子以引入随机性.回想一下,所有(Q)RNG都是确定性的.你在这里看到的,康拉德会称之为一个功能.

来自文档:

要更改RNG种子,请使用arma_rng::set_seed(value)arma_rng::set_seed_random()运行.

演示

一个稍微修复过的文件版本:

/tmp$ cat armaRand.cpp 
#include<armadillo>

int main(){
  arma::arma_rng::set_seed_random();
  arma::mat(3,3, arma::fill::randu).print();
  exit(0);
}
/tmp$ g++ -o armaRand armaRand.cpp 
/tmp$ ./armaRand 
   0.8824   0.4457   0.3589
   0.7134   0.4768   0.8335
   0.0171   0.4119   0.3720
/tmp$ ./armaRand 
   0.3417   0.3643   0.6865
   0.2814   0.0191   0.6797
   0.9737   0.1593   0.5013
/tmp$ 
Run Code Online (Sandbox Code Playgroud)

如果您想要可重现的结果,您希望使用其他变量并跟踪种子.

编辑:在2018年末,随着更新版本的Armadillo,现在需要链接,所以请制作它g++ -o armaRand armaRand.cpp -larmadillo.其余的仍然成立:通过用(足够的)随机位播种随机数发生器,我们可以得到预期的不同答案.