# Random rows in matrix so no element from the first column occur twice in a row

3 views (last 30 days)

Show older comments

Hi,

I have a matrix of x rows and 8 columns and need to random the rows so no element from the first column occur twice in a row.

It is a x times 8 double.

I know how to random the first coulumn but end up with a x times 1 array instad.

Thank you in advance

##### 0 Comments

### Accepted Answer

Adam Danz
on 22 Mar 2023

Edited: Adam Danz
on 23 Mar 2023

There is no general solution since the values in column 1 may not sufficiently vary. For example, what if all of the values in column 1 were identical? Or what if the values in column 1 were [1;1;1;2]?

Assuming the data in column 1 sufficiently varies, you can use randperm to randomly permute the rows of the matrix. But that doesn't guarantee a lack of consecutive identical values. You could pemute the rows within a while-loop that continues to apply random permutations until the condition is satisfied or until all possibilities are exhausted, though this approach challenges the notion of randomness.

Here's a demo. If there are no permutations that satisfy the constraints, a warning is thrown (you can change that however you'd like).

rng default % for demo purposes

M = randi(3,8,3)

accepted = false;

nrows = height(M);

nPossibilities = factorial(nrows); % number of possible permutations

count = 0;

while ~accepted

% If there are still consecutive identical values or

% if we ran out of possible permutations

if any(diff(M(:,1))==0) && count <= nPossibilities

pidx = randperm(nrows);

M = M(pidx,:);

count = count+1;

else

accepted = true;

% Final check: throw warning if no permutations worked.

if any(diff(M(:,1))==0)

warning('No permutations result in non-consecutive values.')

end

end

end

disp(M)

Replace the demo matrix with M = randi(2,8,3) to see the warning.

Note, if the matrix has many rows and the values in column 1 do not sufficiently vary, this could run a very long time. For example, a matrix with 10 rows has 3,628,800 possible permutations. If you expect to have this issue, you'll need a smarter solution that initially determines whether a permutation is possible.

##### 2 Comments

Adam Danz
on 23 Mar 2023

### More Answers (1)

Cameron
on 22 Mar 2023

A = randi(100,5,8);

A

[~,randrow] = sort(rand(size(A,1),1));

RandA = A(randrow,:)

##### 0 Comments

### See Also

### Community Treasure Hunt

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

Start Hunting!