有没有办法使用 armadillo c++ 库在 c++ 中设置独立的随机流?
is there a way to set independent random streams in c++ using the armadillo c++ library?
我想要来自 armadillo rand 库的两个独立的随机流。看起来他们都使用相同的全局随机流。
我可以通过以下方式使用犰狳库生成随机数:
arma::arma_rng::set_seed(13)
double r = arma::randu()
但我不确定如何获得两个随机流。在 python 中,我知道我可以使用 numpy 中的随机库通过以下方式做到这一点:
rn = random.RandomState(13)
rn2 = random.RandomState(11)
现在如果我 运行 rn.rand() 和 rn2.rand() 它们是独立的并且不会相互影响。有什么想法吗?
谢谢!
独立的随机数生成器可以与 Armadillo 中的 .imbue() 函数结合使用。
以下代码改编自Armadillo documentation。需要 C++11 编译器才能使用 std::mt19937
和 std::uniform_real_distribution
.
std::mt19937 engine1; // Mersenne twister random number engine
std::mt19937 engine2;
// ... set the seeds for engine1 and engine2 here ...
std::uniform_real_distribution<double> distr(0.0, 1.0);
mat A(4,5);
mat B(4,10);
A.imbue( [&]() { return distr(engine1); } );
B.imbue( [&]() { return distr(engine2); } );
有关梅森引擎的更多信息:http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine
关于 std::uniform_real_distribution 的更多信息:http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution
我想要来自 armadillo rand 库的两个独立的随机流。看起来他们都使用相同的全局随机流。
我可以通过以下方式使用犰狳库生成随机数:
arma::arma_rng::set_seed(13)
double r = arma::randu()
但我不确定如何获得两个随机流。在 python 中,我知道我可以使用 numpy 中的随机库通过以下方式做到这一点:
rn = random.RandomState(13)
rn2 = random.RandomState(11)
现在如果我 运行 rn.rand() 和 rn2.rand() 它们是独立的并且不会相互影响。有什么想法吗?
谢谢!
独立的随机数生成器可以与 Armadillo 中的 .imbue() 函数结合使用。
以下代码改编自Armadillo documentation。需要 C++11 编译器才能使用 std::mt19937
和 std::uniform_real_distribution
.
std::mt19937 engine1; // Mersenne twister random number engine
std::mt19937 engine2;
// ... set the seeds for engine1 and engine2 here ...
std::uniform_real_distribution<double> distr(0.0, 1.0);
mat A(4,5);
mat B(4,10);
A.imbue( [&]() { return distr(engine1); } );
B.imbue( [&]() { return distr(engine2); } );
有关梅森引擎的更多信息:http://en.cppreference.com/w/cpp/numeric/random/mersenne_twister_engine
关于 std::uniform_real_distribution 的更多信息:http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution