使用相同的种子在不同的操作系统上生成相同的随机数序列

33

有没有办法使用相同的种子在不同操作系统上生成相同的随机整数序列? 我尝试了这段代码:

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

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


6
使用 std::mt19937,因为 std::default_random_engine 在不同系统上可能不是相同的 PNRG。 - Hatted Rooster
2
我认为像 std::mt19937 这样的特定随机引擎需要为特定种子提供相同的数字,但我不认为分布是必需的。因此,您可能需要编写自己的分布函数。 - Chris Drew
即使您使用std::mt19937作为种子,像std::discrete_distribution这样的分布也会产生不同的结果。 - anilbey
1个回答

40

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

您需要的是诸如std :: mt19937 之类的东西,它要求对于相同的种子产生相同的输出。事实上,在 <random> 中定义的所有生成器(除了std::default_random_engine engine)在使用相同的种子时将产生相同的输出。

您还需要知道的另一件事是,std :: uniform_int_distribution 也是实现定义的。它必须使用的公式已经定义,但它实现方式留给实现者决定。这意味着您可能无法获得完全相同的输出。如果您需要可移植性,则需要自己编写分布,或获取一个第三方分布,无论平台如何都将始终保持相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接