我希望生成在一个范围内占据完整周期的伪随机数/排列。通常可以使用“线性同余生成器”(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可以是几百万甚至32位/ 40亿。
- 计算不应遭受溢出,并且应高效/快速,即没有大的指数或十几个乘除运算。
- 序列不必非常随机或安全-我不需要密码随机性(但如果可行,则可以使用它),只需“好”的随机性或明显的随机性,而无奇/偶序列。
任何想法都受到赞赏-提前感谢。
更新:理想情况下,范围变量可能不是2的幂,但在任一情况下都应起作用。