如果我们在不同的机器上将c ++ 11 mt19937作为相同的种子,我们将获得相同的随机数序列

onu*_*tas 6 c++ random c++11

从灵感和类似的问题,我想学习如何做在C++ 11周的行为mt19937伪随机数生成器,当两个单独的机器,它与相同的输入种子.

换句话说,我们有以下代码;

std::mt19937 gen{ourSeed};
std::uniform_int_distribution<int> dest{0, 10000};
int randNumber = dist(gen);
Run Code Online (Sandbox Code Playgroud)

如果我们在不同的时间在不同的机器上尝试这个代码,我们每次都会获得相同的randNumber值序列或不同的序列吗?

在任何一种情况下,为什么会这样呢?

还有一个问题:

无论种子如何,这段代码会无限地随机生成数字吗?我的意思是,例如,如果我们在一个运行数月但没有停止的程序中使用这个代码块,那么数字的生成或数字的一致性会有问题吗?

Yak*_*ont 10

发电机将产生相同的值.

分布可能没有,至少在不同的编译器或库版本.该标准未将其行为指定为该详细程度.如果您希望编译器和库版本之间保持稳定,则必须滚动自己的发行版.

禁止库/编译器更改,它将以相同的顺序返回相同的值.但是,如果你关心写自己的发行版.

...

所有PRNG都有模式和期限. mt19937以2 ^ 19937-1的周期命名,这不太可能成为问题.但其他模式可以发展.MT PRNG对许多统计测试都很强大,但它们不是密码学上安全的PRNG.

因此,如果您运行数月将成为一个问题,将取决于您发现的问题的具体细节.但是,mt19937将是一个比你自己写的更好的PRNG.但假设攻击者可以根据过去的证据预测其未来行为.

  • @onur Period,就像一个sin波的时期是2 pi.它在2 ^ 19937 -1步之后重复.当2 ^ 10约为10 ^ 3时,这是1,然后是6000 0(约).在1 GHz(10 ^ 9)时,重复自身需要10 ^ 6000(大约)秒.我故意重复这个数字 - 旁边有10亿是微不足道的.大爆炸以来的时间也是如此.请注意,很长一段时间只是您希望PRNG拥有的众多属性之一,而不是完美的证据, (2认同)