我如何进行随机交换但是对该数字从其原始位置移动的距离施加限制?

use*_*845 6 matlab

一组20个数字已存储在矢量中d,例如:

d = [ 5 6 7 8 9 ....]
Run Code Online (Sandbox Code Playgroud)

我用

i = randperm(length(d));
d = d(i);
Run Code Online (Sandbox Code Playgroud)

随机改组矩阵内的数字.

但是,我需要找到一种限制随机播放的方法,以确保数字不会从原始位置移动到"5"以上的位置?

意思是如果最初d(2) = 6,最终的位置6应该只移动d(1)d(2+5).

注意,d(1)因为数字不能移动到负面位置.

任何有关这方面的帮助将不胜感激!另外,如果有一个更有效的洗牌方式,请告诉我!

Dan*_*iel 2

我的解决方案是创建随机排列并交换坏索引,只要没有索引违反距离规则即可。

d=data
delta=5;
i= randperm(length(d));
v=badPosition(i);
while(v~=0)
    %lower bound for position     
    a=max(1,i(v)-5);
    %upper bound for position
    A=min(numel(i),i(v)+5);
    spos=randi([a,A]);
    h=i(v);
    i(v)=i(spos);
    i(spos)=h;
    v=badPosition(i);
end
d=d(i)
Run Code Online (Sandbox Code Playgroud)
function pos=badPosition(indices)
delta=5;
allPos=(find(indices>(1:numel(indices))+delta|indices<(1:numel(indices))-delta));
if numel(allPos)>0
    pos=allPos(randi(numel(allPos)));
else
    pos=0;
end
end
Run Code Online (Sandbox Code Playgroud)

badPosition是一个函数,如果所有索引都正确则返回 0,否则返回一个违反距离规则的索引。如果存在多个违规,则选择随机索引。