Arrays 带距离限制的数组洗牌算法

Arrays 带距离限制的数组洗牌算法,arrays,algorithm,random,permutation,shuffle,Arrays,Algorithm,Random,Permutation,Shuffle,例如,我有以下数组: array numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 我想洗牌这个数组。但是有一个距离限制:每个元素的新位置必须从旧位置-n到旧位置+n 例如,如果n=4,则此数组适合我: array new_numbers = {2, 3, 4, 0, 1, 6, 5, 8, 9, 7} 我试着想出一些算法。但是我没有成功。这里有一些伪代码可能会有所帮助。请注意,该算法的重点是遵守距离规则,牺牲过程中的一致性* choose a random

例如,我有以下数组:

array numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
我想洗牌这个数组。但是有一个距离限制:每个元素的新位置必须从
旧位置-n
旧位置+n

例如,如果
n=4
,则此数组适合我:

array new_numbers = {2, 3, 4, 0, 1, 6, 5, 8, 9, 7}

我试着想出一些算法。但是我没有成功。

这里有一些伪代码可能会有所帮助。请注意,该算法的重点是遵守距离规则,牺牲过程中的一致性*

choose a random array index (call it "i" )
there's number at array[i] (call it "A")
set "count" to 0
for each "j" such that array[j] is a valid location for "A"
{
    there's a number at array[j] (call it "B")
    if ( "B" can be legally moved to array[i] )
        increment "count" 
}
generate a random number between 0 and count-1
find the index "j" that corresponds to that random number
swap array[i] with array[j]

repeat the above sequence a satisfactory number of times

*在我看来,问题定义需要非均匀分布,因为例如,数组的开始和结束的值比数组中间的值具有更少的法律位置。因此,试图开发一个可证明是一致的算法似乎是一件愚蠢的事情。

你想要什么分布?@Davidisenstat,我想要一个均匀分布。
n
可以有多大?第一个数组中有9个元素,第二个数组中有10个元素,所以这不是我所说的无序排列。也不清楚n是什么-,它是一个自由参数,我们给出了它的值吗?David Eisenstat,对n没有任何限制。是的,你是对的。这是我的错。事实上,分布是不均匀的。如果不跟踪交换的索引,最终可能会出现级联洗牌,例如“交换(1,3)…交换(3,6)”(假设
n=4
)。最后,
1
到达
6
并移动了超过它应该移动的距离。@Rerito我假设起始数组在索引
I
处有编号
I
,因此您可以通过查看编号来判断哪些索引是有效的。因此,在“交换(1,3)”之后,进行“交换(3,6)”是不合法的,因为“1”的有效位置将是0到5。换句话说,每个“j”的循环
将是0到5中j的
。我的想法是正确的,这就是为什么我问解决方案是否必须到位。。。正在等待答案:)。(我会在阴影阵列洗牌后进行交换,而不是在每一步进行交换)@Max,这就是重点。您将构建一个满足此条件的数组。你洗牌,然后用它洗牌目标阵列。