一组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)因为数字不能移动到负面位置.
任何有关这方面的帮助将不胜感激!另外,如果有一个更有效的洗牌方式,请告诉我!
我的解决方案是创建随机排列并交换坏索引,只要没有索引违反距离规则即可。
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,否则返回一个违反距离规则的索引。如果存在多个违规,则选择随机索引。