生成从0到n的整数的无状态伪随机排列?

时间:2013-01-16 15:52:05

标签: algorithm math

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),我不能用数学证明它。而且有点太明显了。

有没有更好的方法来产生这种排列?

2 个答案:

答案 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的最后一个值,