最大値までの整数に対して、遅延フィボナッチ疑似乱数ジェネレーターを実装しようとしています。値の配列を維持します
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
data は悪いスタイルですが、C と C++ の両方のプログラマーが読めるようにしたいのです。これは両方の言語に関係するからです。)