我想在可配置的范围内进行独立的整数随机分布。我原来的内容由以下程序说明:
#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似乎生成相同的随机数序列。所有其他组合产生看似独立的样本。
libstdc ++似乎将minstd_rand0
用于default_random_engine
。
在视觉工作室(以及可能是其他实现)中,0
的种子被明确地转换为1
的种子。
使用不同的种子值或明确选择要使用的引擎。您无法控制default_random_engine
生成的内容,不同的标准库将选择具有不同属性的生成器。例如,visual studio使用mt19937
。
一些伪随机数引擎可以具有多个具有相关性或甚至相同序列的种子。对于线性同余生成器尤其如此。
为避免引擎与不同种子的相关性:
generator.modulus
,...)。-
template< class Sseq >
void seed( Sseq& seq );