【发布时间】:2010-08-26 04:40:57
【问题描述】:
我需要构建一个具有可调周期的就地伪随机数生成器。此外,一个周期内不得发生碰撞。也就是说,以下内容必须返回 true:
// 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 是不可接受的;它必须至少是有点随机的。
我已经研究过线性同余生成器,但这似乎是针对我的特定约束的错误路径。
(暴力破解不是一种选择,除非它相对较快(几秒钟)。)
【问题讨论】: