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似乎生成相同的随机数序列。所有其他组合生成看似独立的样本。
一些伪随机数引擎可以具有多个相关的种子,甚至可以具有相同的序列。对于线性同余发生器尤其如此。
为了避免具有不同种子的引擎的关联:
generator.modulus避免使用标识元素作为所有引擎的种子(0、1、空序列、 ...)。-
template< class Sseq >
void seed( Sseq& seq );
Run Code Online (Sandbox Code Playgroud)