【发布时间】:2011-04-26 22:27:48
【问题描述】:
我正在尝试实现一个lagged Fibonacci 伪随机数生成器,以生成最大整数。它维护一个值数组
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 中,或者您的意思是仅 C++)? -
在 C 中这也是一种糟糕的风格,因为它会导致代码不可重入。
-
@endolith:因为它使代码非线程安全。
-
@larsmans:为什么这么糟糕?或者更确切地说,什么时候不好?如果语言结构总是不好,就不会存在,不是吗?
-
@endolith:我倾向于以线程安全的方式编写代码,除非我在这种情况下进行实验。所以是的,
static有一个用途,就是这样,但这只是一个一次性程序。
标签: c++ c arrays random circular-buffer