Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 生成从0到n的整数的无状态伪随机排列?_Algorithm_Math - Fatal编程技术网

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

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) 编辑 我提出了洗牌的想法,因为似乎每次都要以相同的数

这个问题源于。这个问题可以表述如下:

给定两个正整数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)

编辑


我提出了洗牌的想法,因为似乎每次都要以相同的数字递增。如果你想要一个真正的“随机”在第一个元素中有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