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

时间:2015-02-19 00:16:03

标签: c++ random armadillo prng

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

问题在于,虽然我可以将种子设置为确定的值,从而在我的机器上重新创建相同的运行...但是当我去另一台计算机时,我失去了随机性的连贯性。我来自Matlab的魔法之地,在那里我可以指定用于生成伪随机数的函数。因此,如果选择好功能,这一代可以跨平台。 但是如何为Armadillo指定RNG功能?

我的研究让我得到了这个源文档,"详细信息"随机数生成的过程:

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

但我不知道该怎么做:这段代码比我写的要先进得多。我将不胜感激任何帮助!

谢谢你们!

说明: - 我不在乎使用的随机函数有多好。我只想要一个快速的跨平台跨架构生成器。无论如何,确定性随机性是我的目标。 - 详细说明,如果重要,要考虑的机器应该是intel处理器,windows或mac,32b或64b。 - 我已经阅读了几篇提到随机使用种子的帖子,但似乎这里的问题是跨平台环境以及随机生成器在犰狳内埋藏(至少未训练的眼睛)的事实代码。

1 个答案:

答案 0 :(得分:1)

在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中的标准功能提供。默认参数应该在编译器供应商和版本之间保持稳定,并且独立于操作系统。