我想将std :: mt19937随机数发生器的状态保存在一个C ++程序中,这样我就可以在稍后的阶段以相同的“随机状态”恢复我的程序。 我也想在不同的平台(Linux和Mac)上使用我的程序。
考虑下面的最简单的例子,我简单地把当前状态写入stdout:
#include <iostream> #include <random> using namespace std; static mt19937 rng; int main() { seed_seq seeder{1234}; rng = mt19937(seeder); cout << "mt1: " << rng() << endl; cout << "mt2: " << rng() << endl; cout.imbue(locale("en_US.UTF-8")); cout << rng << endl; }
我的问题是,这将产生不同的输出状态,这取决于我编译这个平台。 在Linux系统(g ++ 7.1.0)上,我得到:
mt1: 2684129121 mt2: 3957864051 3,598,990,873 2,041,003,246 [...]
而在我的Mac(苹果LLVM 8.1.0),我得到:
打印一个随机数返回一个负数。 (的/ dev / urandom的)
/ dev / zero或/ dev / random – 什么更安全,为什么?
mt1: 2684129121 mt2: 3957864051 1,413,537,266 1,230,536,264 [...]
基本上我想明白为什么国家是不同的,我怎样才能实现它们是相同的,这样我就可以在系统之间保存和加载状态。
这个问题是关系到这一个: C + + std :: mt19937和rng状态保存/加载和可移植性但是,线程不回答我的问题。 它提供了使用相同的语言环境的提示,但是这似乎不影响状态。
独立的c + +操作系统(windows&linux)开源随机数生成器库?
程序输出的随机数序列与Linux上实际的rand()输出不匹配(在Windows上正常工作)
`/ dev / urandom`适合模拟目的吗?
/ dev / random权限被拒绝
为什么读/ dev /随机逐字节块这么经常?
因为类的具体实现取决于编译器/平台,所以你真的不会达到你想要的STL。
如果你想要一个一致的实现,那么我建议看看使用Boost。 它具有STL兼容的所有随机类的实现。 (它也比STL有一些优点,例如允许boost::random::random_device被用作种子序列)。 您也可以自行实现该类,不过Boost是可以使用的现有的跨平台实现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。