Algorithm 生成从0到n的整数的无状态伪随机排列?
这个问题源于。这个问题可以表述如下: 给定两个正整数n和m,以及m0->3->2->1等。我偶然发现了这个解,它甚至是一般的(Algorithm 生成从0到n的整数的无状态伪随机排列?,algorithm,math,Algorithm,Math,这个问题源于。这个问题可以表述如下: 给定两个正整数n和m,以及m0->3->2->1等。我偶然发现了这个解,它甚至是一般的((I+n)%(n+1)对于任何n),我无法用数学证明它。这有点太明显了 有没有更好的方法来生成这样的排列?用任何不与(n-m+1)共享一个公共素数因子的数字来增加每个后续的数字将覆盖序列(例如,对于序列[2-11](10个数字)增加3、7或9会起作用,但2、4、5、6和8不会起作用,因为它们共享一个公约数(2和/或5) 编辑 我提出了洗牌的想法,因为似乎每次都要以相同的数
(I+n)%(n+1)
对于任何n
),我无法用数学证明它。这有点太明显了
有没有更好的方法来生成这样的排列?用任何不与
(n-m+1)
共享一个公共素数因子的数字来增加每个后续的数字将覆盖序列(例如,对于序列[2-11]
(10个数字)增加3、7或9会起作用,但2、4、5、6和8不会起作用,因为它们共享一个公约数(2和/或5)
编辑
我提出了洗牌的想法,因为似乎每次都要以相同的数字递增。如果你想要一个真正的“随机”在第一个元素中有m的序列只需取出m并将其放在开头。不过,我不确定这对您有何帮助。我不确定您在问题中要引用的
m
,或者您如何定义“一组数字”)。但是,获得数字循环的一种方法是使用以下形式的递归(或迭代):
next = f(current)
对于某些函数f。例如,线性全等RNG使用迭代:
x = ( a · x + c ) mod m where 0 < a, c < m
(这是赫尔-多贝尔定理。)
注意,对于任何m,a,c==1满足上述标准。此外,如果m是素数,则a和c的任何值都满足该准则,如果m是2的幂,则任何a,c都满足该准则,使得a==1模4,c==1模2。然而,对于m的某些值(例如6),a的唯一有效值是1
这可能不符合“无状态”的条件,但我认为没有任何严格的无状态解决方案;例如,您可以查找某个函数f
,以便:
f(0), f(1),... f(m-1)
是的一个排列
0, 1, ..., m-1
因此,您可以通过调用
f(i)
来生成循环,以获得i
的连续值。但这仍然是一种状态,因为你必须记住你使用的i
的最后一个值,你到底需要m做什么?@proskor,比如说,初始值——可以随机确定——你是什么意思找到一个从0到n循环和覆盖的“数字套件”?为什么不直接使用数字0…n?你想让它看起来是随机的吗?如果是这样的话,我会将问题改写为“如何有效地生成0..n的置换”,例如,增加当前值并计算除法的剩余部分将循环从0到n-1的所有值。因此公式是next=(当前+n)%(n+1)。。。可以是(current+1)%(n+1),这是一个明显的循环(或者我不理解这个问题/我不明白它的意义),所以你也可以对[0..m-1]进行复制?事实上,问题是,我真的不想每次增加相同的数字,这让它太“容易”,可以这么说。@fge如果它真的是无状态的,每次操作都需要相同,不是吗?m
应该是起点,它可以是0
和n
之间的任何数字。至于“suite”,我想我可以说是“sequence”。@fge,使用线性同余生成,如果你有一个有效的(a,c)对,你可以从[0,n]范围内的任何值开始,因为循环已经完成。除此之外,我试着探索在编辑中“无状态”可能意味着什么。
f(0), f(1),... f(m-1)
0, 1, ..., m-1