我需要建立一个周期可调的就地伪随机数发生器。另外,一个时期内不得有冲突。也就是说,以下必须返回true:PRNG可调周期
// prng is "generated" at run-time
// (though a by-hand solution would work)
bool test(func prng, int period) {
int seed = 0; // Any number should work
int cur = seed;
for (int i = 0; i <= period; ++i) {
cur = prng(cur);
if (cur == seed) {
if (i == period) {
// We hit our period on target
return true;
}
// Period too low (we hit our seed already!)
return false;
}
}
// Period too high
return false;
}
(实施例是伪代码;在任何常用可读语言(C++,Python和Haskell中,等)中的答案为是可接受的。)
的PRNG必须而不是在生成数字时依赖于可变静态。也就是说,我不能拥有一个已经返回的数字或类似的东西。它只应该依靠给定的输入来生成下一个词。该算法不一定是密码强(当然),或“强”随机。但是,x % period
是不可接受的;它必须至少有随机有点。
我已经看过线性同余发生器,但这似乎是我的具体约束所采取的错误路径。
(暴力破解是不是一种选择,除非它是相对快速(几秒钟)。)