有没有办法使用 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::mt19937std::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