在C ++中,为什么不能使用两个默认随机引擎生成独立的随机整数样本

doe*_*toe 5 c++ random c++-standard-library

我想要在可配置范围内具有独立的整数随机分布。以下程序说明了我最初的工作:

#include <random>
#include <cstdio>
#include <cstdlib>
using namespace std;

int main(int argc, char* argv[])
{
    default_random_engine generator1;
    default_random_engine generator2;
    uniform_int_distribution<int> dist1(0,atoi(argv[1]));
    uniform_int_distribution<int> dist2(0,atoi(argv[2]));

    generator1.seed(0);
    generator2.seed(1);
    for (int i = 0; i < 60; i++)
        printf("(%d, %d)\n", dist1(generator1), dist2(generator2));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

事实证明,当argv [1]和argv [2]相等时,始终会生成相等的值,并且当它们不同时,依存关系也就不太明显。为了防万一,我使用了不同的引擎实例,甚至为它们植入了不同的种子。

这里发生了什么?我注意到如果我用mt19937替换default_random_engine,问题就消失了,但这是我从未想过的。另外,另一个引擎应该能够产生独立的样本吗?

编辑我正在使用标准库中的g ++ 7.3.0在Ubuntu 16.04.2上工作。

编辑2正如FrançoisAndrieux在评论中推测的那样,这似乎是我环境中特定的默认随机生成器的特殊之处:种子0和1似乎生成相同的随机数序列。所有其他组合生成看似独立的样本。

eer*_*ika 2

一些伪随机数引擎可以具有多个相关的种子,甚至可以具有相同的序列。对于线性同余发生器尤其如此。

为了避免具有不同种子的引擎的关联:

  1. 使用更好的引擎,例如 Mersenne Twister。
  2. generator.modulus避免使用标识元素作为所有引擎的种子(0、1、空序列、 ...)。
  3. 不使用单个种子,而是使用种子序列:

-

template< class Sseq >
void seed( Sseq& seq );
Run Code Online (Sandbox Code Playgroud)