我希望生成在一个范围内“占据”一个完整周期或完整周期的伪随机数/排列。通常可以使用“线性同余生成器”(LCG)来生成这样的序列,使用如下公式:
X = (a*Xs+c) Mod R
其中 Xs 是种子,X 是结果,a 和 c 是互质常数,R 是最大值(范围)。
(通过全周期/全周期,我的意思是可以选择常数,以便任何 X 在某个随机/置换序列中仅出现一次,并且将在 0 到 R-1 或 1 到 R 的范围内)。
LCG几乎可以满足我的所有需求。我对 LCG 的问题是奇数/偶数结果的非随机性,即:对于种子 Xn,结果 X 将交替奇数/偶数。
问题:
有人知道如何创建不会交替奇数/偶数的类似东西吗?
我相信可以建造“复合 LCG”,但我没有详细信息。有人可以举一个这个CLCG的例子吗?
是否有可能满足上述细节和以下限制的替代公式?
约束:
- 我想要一些基于简单种子公式的东西。即:要获得下一个数字,我提供种子并获得置换序列中的下一个“随机数”。具体来说,我不能使用预先计算的数组。(见下一点)
- 序列绝对必须是“全周期/全周期”
- 范围R可能是几百万甚至32bit/40亿。
计算不应溢出并且高效/快速,即:没有大指数或数十个乘法/除法。
序列不必非常随机或安全 - 我不需要加密随机性(但如果可行的话可以使用它),只需“良好”随机性或明显随机性,没有奇数/偶数序列。
任何想法表示赞赏 - 在此先感谢。
更新:理想情况下,范围变量可能不是 2 的精确幂,但在任何一种情况下都应该有效。