从灵感这和类似的问题,我想学习如何做在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.但假设攻击者可以根据过去的证据预测其未来行为.