我正在尝试实现一个最大可生成整数的滞后斐波那契伪随机数生成器。它维护一个值数组。
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++ 程序员都可读,因为它涉及两种语言。)
static
数据是不好的风格(或者你只是指C++)? - pmgstatic
有用处,而这就是它的用途,但只是一个一次性程序。 - Fred Fooidx
)作为指针传递并使用它来解决您的“静态”数据问题(以及可重入性问题):“unsigned lagfib(unsigned* idx)”。然后用户只需在第一次调用之前手动将其初始化为0(或使用lagfib_init(&state)
)。如果您不确定idx
是否始终是unsigned
,则可以在typedef后面隐藏其类型,或者将它隐藏在(非不透明的实现原因,不透明的API方式)struct lagfib_stat
中。 - Tim Čas