this one产生的问题。问题可以表述如下:
给定两个正整数n和m,m< = n,有没有办法找到一组数字,它们循环并覆盖从0到n的所有可能值?
作为一个基本的例子,如果我们将3作为数字,对于0到3之间的任何数字current
,我们可以将下一个值计算为:
next = (current+3) % 4
这将循环。例如:1 - > 0 - > 3 - > 2 - > 1等我通过“偶然”找到了这个解决方案,它甚至是一般的((i + n) % (n + 1)
对于任何n
),我不能用数学证明它。而且有点太明显了。
有没有更好的方法来产生这种排列?
答案 0 :(得分:3)
通过任何数字递增每个后续数字,该数字不与(n-m+1)
共享公共质数除数将覆盖序列(例如,序列[2-11]
(10个数字)递增3,7或9会起作用,但是2,4,5,6和8不会,因为它们有一个共同的除数(2和/或5)
修改强>
我拿出了洗牌的想法,因为你似乎每次都要增加相同的数字。如果你想要一个真正的“随机”序列,在第一个元素上有m,只需取m并将其放在开头即可。不过,我不确定这对你有什么帮助。
答案 1 :(得分:3)
我不确定你想在问题中提到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),唯一有效的值是1。
这可能不符合“无国籍”的标准,但我认为没有任何严格的无国籍解决方案;例如,您可能会查找某个函数f
,以便:
f(0), f(1),... f(m-1)
是
的排列0, 1, ..., m-1
这样您就可以通过为f(i)
的连续值调用i
来生成周期。但这仍然是一个状态,因为你必须记住你使用的i
的最后一个值,