我正在尝试为整数实现一个滞后的斐波那契伪随机数生成器,直到某个最大值。它维护一个值数组
int values[SIZE] = { /* 55 seed values */ };
并使用以下函数返回下一个值
unsigned lagfib()
{
static unsigned idx = 0;
int r = values[idx];
/* The following does not work: */
values[idx] = (values[(idx-24) % SIZE] + values[(idx-55) % SIZE])
% MAX_VALUE;
idx = (idx+1) % SIZE;
return r;
}
实际上,values
应该是一个始终满的简单环形缓冲区。减法和模数应该将索引环绕到数组的末尾。SIZE
应始终至少为 55,但我想四舍五入到 64 以加快模数。
但显然,我的模计算错误,我不知道如何解决它们。将索引类型更改为int
不会改善情况。
(PS:是的,static
数据风格不好,但我希望这对于 C 和 C++ 程序员来说都是可读的,因为它适用于两种语言。)