我不确定您打算m
在问题中提及什么,或者您如何定义“一组数字”)。但是,获得数字循环的一种方法是使用以下形式的递归(或迭代):
next = f(current)
对于某些函数 f。例如,线性同余 RNG 使用迭代:
x = ( a · x + c ) mod m where 0 < a, c < m
它们并不总是产生从 0 到 m-1 的所有值,但在某些情况下它们会:
c and m are relatively prime
a - 1 is divisible by every prime factor of m (not including m)
if m is divisible by 4, a - 1 is divisible by 4.
(这是赫尔-多贝尔定理。)
请注意,a, c == 1 对于任何 m 都满足上述标准。此外,如果 m 是素数,则 a 和 c 的任何值都满足标准,如果 m 是 2 的幂,则任何 a、c 都满足标准,使得 a == 1 mod 4 和 c == 1 mod 2. 但是,对于某些 m 值(例如 6),唯一有效的 a 值是 1。
这可能不符合“无国籍”的条件,但我认为没有任何严格的无国籍解决方案;例如,您可能会寻找一些功能f
,例如:
f(0), f(1),... f(m-1)
是一个排列
0, 1, ..., m-1
这样您就可以通过调用f(i)
的连续值来生成循环i
。但这仍然是一个状态,因为你必须记住i
你使用的最后一个值,