私はrand_r
インターフェイスの許容品質バージョンを実装しようとしていますが、これには、全体の状態が type の単一のオブジェクトに格納されるという残念なインターフェイス要件があります。unsigned
これは、私の目的では正確に 32 ビットを意味します。さらに、出力範囲を にする必要があります[0,2³¹-1]
。標準的な解決策は、LCG を使用して下位ビット (周期が最も短い) をドロップすることですが、それでも次の数ビットの周期が非常に悪くなります。
私が最初に考えたのは、LCG を 2 回または 3 回繰り返して、出力の高/低または高/中/低ビットを生成することでした。ただし、このようなアプローチでは偏りのない分布は維持されません。各出力値の頻度が等しいのではなく、多くは複数回発生し、まったく発生しないものもあります。
状態は 32 ビットしかないため、PRNG の周期は 2³² に制限されます。偏りをなくすために、PRNG は各値を完全な周期の場合は正確に 2 回出力し、周期が 2³¹ の場合は正確に 1 回出力する必要があります。より短い期間は偏りがありません。
これらの基準を満たすよく知られた PRNG アルゴリズムはありますか?