犰狳生成相同的随机数

Armadillo generates the same random numbers

我在 cygwin64(或 minGW)下使用 Armadillo 包 (v.7.300.1) 生成随机矩阵:

#include<armadillo>

int main(){
  arma::mat(3,3, arma::fill::randu).print();
  return 0;
}

程序(重新构建或重新运行后)总是生成:

0.6900  0.5548  0.2074    
0.5054  0.3784  0.6263    
0.5915  0.2577  0.3401

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

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

来自文档:

To change the RNG seed, use arma_rng::set_seed(value) or arma_rng::set_seed_random() functions.

演示

您文件的略微修复版本:

/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$ 

如果你想要可重现的结果你想使用其他变体并跟踪种子

编辑: 在 2018 年底使用较新版本的犰狳时,现在似乎需要链接,所以请 g++ -o armaRand armaRand.cpp -larmadillo。其余的仍然成立:通过 seeding 具有(足够)随机位的随机数生成器,我们确实得到了预期的不同答案。