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

问题描述 投票:5回答:2

我想在可配置的范围内进行独立的整数随机分布。我原来的内容由以下程序说明:

#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;
}

当argv [1]和argv [2]相等时,这总是生成相等的值,并且当它们不同时具有不太明显的依赖性。如果我使用不同的引擎实例,甚至以不同方式播种它们。

这里发生了什么?我注意到如果我用mt19937替换default_random_engine,问题就会消失,但这是我从未猜到过的。另外,其他发动机应该能够生产独立样品吗?

编辑我正在使用Ubuntu 16.04.2,使用标准存储库中的g ++ 7.3.0。

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

c++ random c++-standard-library
2个回答
2
投票

libstdc ++似乎将minstd_rand0用于default_random_engine

在视觉工作室(以及可能是其他实现)中,0的种子被明确地转换为1的种子。

使用不同的种子值或明确选择要使用的引擎。您无法控制default_random_engine生成的内容,不同的标准库将选择具有不同属性的生成器。例如,visual studio使用mt19937


2
投票

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

为避免引擎与不同种子的相关性:

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

-

template< class Sseq >
void seed( Sseq& seq );
© www.soinside.com 2019 - 2024. All rights reserved.