在具有相同种子的不同操作系统上实现相同的随机数序列

Posted

技术标签:

【中文标题】在具有相同种子的不同操作系统上实现相同的随机数序列【英文标题】:Achieve same random number sequence on different OS with same seed 【发布时间】:2017-03-14 15:35:17 【问题描述】:

有没有办法在不同的操作系统中用相同的种子实现相同的随机整数序列? 我试过这段代码:

std::default_random_engine engine(seed);
std::uniform_int_distribution<int> dist(0, N-1);

如果我在一台机器上使用相同的种子多次运行此代码,则 dist(engine) 的序列是相同的,但在不同的操作系统上序列是不同的。

【问题讨论】:

因为std::default_random_engine 在每个系统上不必是相同的PNRG,所以使用std::mt19937 我相信像std::mt19937 这样的特定随机引擎需要为特定种子提供相同的数字,但我不认为分布是。因此,您可能必须编写自己的发行版。 即使你使用std::mt19937 作为种子,像std::discrete_distribution 这样的分布也会产生不同的结果。 【参考方案1】:

是的,但是您需要在每个平台上使用不同的或者准确地说是相同的 PRNG。 std::default_random_engine engine 是实现定义的 PRNG。这意味着您可能不会在每个平台上获得相同的 PRNG。如果您没有相同的序列,那么您获得相同序列的机会非常低。

您需要像std::mt19937 这样的东西,它需要为相同的种子提供相同的输出。事实上,除了std::default_random_engine engine 之外,&lt;random&gt; 中定义的所有生成器在使用相同的种子时都会产生相同的输出。

您需要知道的另一件事是std::uniform_int_distribution 也是实现定义的。它必须使用的公式已定义,但它实现的方式由实现者决定。这意味着您可能无法获得完全相同的输出。如果您需要可移植性,您将需要推出自己的发行版或获得第三方发行版,无论平台如何,它都始终相同。

【讨论】:

以上是关于在具有相同种子的不同操作系统上实现相同的随机数序列的主要内容,如果未能解决你的问题,请参考以下文章

函数RAND啥意思

C# Random 生成不重复随机数

rand产生随机数怎样控制在1~52内而且不能重复。1~52必须出现一次。谢谢

火花随机森林:相同种子的不同结果

在 Python、NumPy 和 R 中创建相同的随机数序列

Random库用法详解