範囲内の全期間または全サイクルを「占める」疑似乱数/順列を生成したいと思います。通常、「線形合同法」(LCG)を使用して、次のような式を使用してこのようなシーケンスを生成できます。
X = (a*Xs+c) Mod R
Xsがシード、Xが結果、aとcが互いに素の定数、Rが最大(範囲)です。
(全期間/全サイクルとは、任意のXがランダム/順列シーケンスで1回だけ発生し、0からR-1または1からRの範囲内になるように定数を選択できることを意味します)。
LCGは私のニーズのほとんどすべてを満たしています。私がLCGで抱えている問題は、奇数/偶数の結果がランダムでないことです。つまり、シードXnの場合、結果Xは奇数/偶数を交互に繰り返します。
質問:
奇数/偶数を交互にしない類似のものを作成する方法を知っている人はいますか?
「複合LCG」を構築できると思いますが、詳細はわかりません。誰かがこのCLCGの例を挙げてもらえますか?
上記の詳細と以下の制約を満たす可能性のある代替式はありますか?
制約:
- 単純なシードベースの式に基づいたものが欲しいです。つまり、次の番号を取得するために、シードを提供し、並べ替えられたシーケンスで次の「乱数」を取得します。具体的には、事前に計算された配列を使用できません。(次のポイントを参照)
- シーケンスは絶対に「フル期間/フルサイクル」である必要があります
- 範囲Rは、数百万、さらには32ビット/4億になる可能性があります。
計算はオーバーフローを起こさず、効率的/高速である必要があります。つまり、大きな指数や数十の乗算/除算がないことです。
シーケンスは、ひどくランダムまたは安全である必要はありません-暗号化されたランダム性は必要ありません(ただし、実行可能な場合は使用できます)。奇数/偶数シーケンスなしで、「良好な」ランダム性または見かけのランダム性だけです。
どんな考えでもありがたいです-事前に感謝します。
更新:理想的には、範囲変数は正確な2の累乗ではない可能性がありますが、どちらの場合でも機能するはずです。