【问题标题】:How to create the same random numbers on different computers with Armadillo?如何使用犰狳在不同的计算机上创建相同的随机数?
【发布时间】:2015-02-19 00:16:03
【问题描述】:

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

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

我的研究使我找到了这个源文档,它“详细说明”了随机数生成的过程:

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

但我不知道在这里做什么:这段代码比我能写的要先进得多。我将不胜感激!

谢谢你们!

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

【问题讨论】:

  • 快速浏览 API,似乎不清楚为什么在不同的机器上使用相同的种子会产生不同的结果。也许这只是一个错误!由于该库是开源的,您可以尝试调试它。
  • std::rand() 的实现会因操作系统(和操作系统版本)而异。

标签: c++ random armadillo prng


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

【讨论】:

  • 感谢您的帮助。我不知道也不使用 imbue 函数——我应该承认我不明白最后一行的每个符号的含义(尤其是“[&]”?!)但我可以使用它!那么一个附带问题:为什么不能覆盖 std::rand() 生成器来创建不同的数字呢?我知道 std::rand() 可能写得很好,功能也很好,但正如我所说,我现在更关注可复制性而不是性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
相关资源
最近更新 更多