犰狳生成相同的随机数
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 具有(足够)随机位的随机数生成器,我们确实得到了预期的不同答案。
我在 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)
orarma_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 具有(足够)随机位的随机数生成器,我们确实得到了预期的不同答案。