How to randomly swap 2 elements in an array?

1 次查看(过去 30 天)
Suppose that I have the below array:
C= [1 6 5 10 1 2 11 8 2 7 3 7 9 9]
How can I swap randomly only the elements inside the bold numbers
Assume after swap 11 and 3 : C= [1 6 5 10 1 2 3 8 2 7 11 7 9 9]
or swap 10 and " " between 9 9: C= [1 6 5 1 2 11 8 2 7 3 7 9 10 9]

采纳的回答

Rik
Rik 2019-5-1
编辑:Rik 2019-5-1
I'm going to assume at least one of the swap elements must be an number, and that the swapped numbers are allowed to have the same value (so you can some one 9 with another 9).
C= [1 6 5 10 1 2 11 8 2 7 3 7 9 9];
bold=[1 5 6 9 10 12 13 14];
C_temp=cell(1,2*numel(C));
C_temp(2:2:end)=num2cell(C);
valid_idx=1:numel(C_temp);
valid_idx(bold*2)=[];
swap_idx=[1 1];%invalid output to enter the loop
while ~any(mod(swap_idx,2)==0) || ... %at least 1 needs to be a number
swap_idx(1)==swap_idx(2) %the indices must be different
swap_idx=valid_idx(randperm(numel(valid_idx),2));
end
%perform swap
C_temp(swap_idx)=C_temp(swap_idx(end:-1:1));
D=cell2mat(C_temp);
clc,disp(C),disp(D)
  12 个评论
Rik
Rik 2019-5-4
This should prevent the two swapped values to be adjacent (which swaps a value with a gap, meaning it seems the array stays the same).
while ~any(mod(swap_idx,2)==0) || ... %at least 1 needs to be a number
any(swap_idx==1) || ... %the first element (1 before the first number) isn't allowed
abs(diff(swap_idx))<=1 %the indices must be different and more than 1 appart
swap_idx=valid_idx(randperm(numel(valid_idx),2));
end

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by