如何使用犰狳在不同的计算机上创建相同的随机数?

How to create the same random numbers on different computers with Armadillo?

我正在使用 Armadillo c++ 库,它允许对矩阵和向量进行高性能计算。该库具有用随机数填充其对象的内置函数。我在对象的程序随机生成的上下文中使用它。对象创建是随机的,但无论我多久重新创建一次对象,只要种子保持不变,它就会保持不变。

问题是,虽然我可以将种子设置为一个确定的值,从而在我的 machine 上重新创建相同的 运行...我失去了随机性的连贯性去另一台电脑。我来自 Matlab 的神奇之地,在那里我可以指定用于生成伪随机数的函数。所以这一代只要选好功能就可以跨平台。 但是如何为 Armadillo 指定 RNG 函数?

我的研究使我找到了这个源文档,"detail" 随机数生成过程:

http://arma.sourceforge.net/internal_docs_4300/a01181_source.html http://arma.sourceforge.net/internal_docs_4300/a00087.html

但我不知道在这里做什么:这段代码比我能写的要高级得多。如果有任何帮助,我将不胜感激!

谢谢大家!

备注: - 我不在乎使用的随机函数有多好。我只想要一个快速的跨平台跨架构生成器。无论如何,确定性随机性是我的目标。 - 具体来说,如果重要的话,要考虑的 mac 处理器应该是英特尔处理器,windows 或 mac,32b 或 64b。 - 我已经阅读了几篇提到使用种子实现随机性的帖子,但似乎这里的问题是跨平台上下文以及随机生成器被埋在 Armadillo 代码中的事实(至少对我未经训练的眼睛而言)。

在 C++98 / C++03 模式下,Armadillo 将在内部使用 std::rand() 来生成随机数(还有更多内容,但这是对正在发生的事情的一个很好的近似)。

如果您从一个操作系统迁移到另一个操作系统(或跨越同一操作系统的两个版本),则无法保证系统提供的随机数生成器相同。

如果您在 C++11 模式下使用 Armadillo,您可以在 .imbue() 函数的帮助下使用您喜欢的任何随机数生成器。示例:

std::mt19937 engine;  // Mersenne twister random number engine with default parameters

std::uniform_real_distribution<double> distr(0.0, 1.0);

mat A(123,456);

A.imbue( [&]() { return distr(engine); } );  // fill with random numbers provided by the engine

Mersenne twister 随机数引擎在 C++11 中作为标准功能提供。默认参数在编译器供应商和版本之间应该是稳定的,并且独立于操作系统。