How to generate a vector of numbers picked from two groups with the condition that there cannot be more than 2 consecutive numbers from the same group?

1 visualización (últimos 30 días)
Dear people,
I created a vector with 26 ones, 26 twos, 26 threes and so on until the number 12. Then I shuffle these numbers in another vector so now the vector is like this a = [1 5 2 10 9 3 5...]. From these 12 different numbers some of them (let's say 1 2 3 and 4) come from the same group (group A) and the rest come from group B.
The problem is that I need them to not be more than 2 of the same group in a row (for example if I have [1 3 2..] is wrong, but if I have [1 3 6...] it's okay).
I created a loop in which I check if there are more than 2 numbers of the same group in a row, and if it is the case I reshuffle the main vector. But Matlab never stops. Do you know another possibility to achieve what I need?
Thank you so much in advance

Respuestas (1)

Jeff Miller
Jeff Miller el 25 de Feb. de 2022
If I understand what you are asking, this should be close to what you want:
vecLength = 20; % how many numbers you want to generate
group1Numbers = 1:4; % specify which numbers belong to each group
group2Numbers = 5:12;
% first make a vector with group numbers 1 or 2, with a max of 2 in a row
% from the same group
groupVec = zeros(vecLength,1);
groupVec(1:2) = randi([1, 2],2,1);
for ipos=3:vecLength
if groupVec(ipos-2) == groupVec(ipos-1)
groupVec(ipos) = 3 - groupVec(ipos-1); % switch group 1 to 2 or vice versa
else
groupVec(ipos) = randi([1, 2],1,1);
end
end
groupVec' % this is the sequence of group numbers
% now pick numbers randomly from the pre-selected groups:
finalVec = zeros(vecLength,1);
for ipos=1:vecLength
switch groupVec(ipos)
case 1
randpos = randi([1 numel(group1Numbers)],1,1);
finalVec(ipos) = group1Numbers(randpos);
case 2
randpos = randi([1 numel(group2Numbers)],1,1);
finalVec(ipos) = group2Numbers(randpos);
end
end
finalVec' % this is the final sequence of numbers that I think you wanted
  3 comentarios
Jeff Miller
Jeff Miller el 26 de Feb. de 2022
That's a much tougher problem, which I do not know how to solve.
I am not surprised that MATLAB never finds a solution, since there are so many more random sequences that are not solutions than there are sequences that are solutions.
I would try to generate an acceptable sequence of 1's and 2's first. Once you had that sequence, you could replace each 1 or 2 with a number from its corresponding group. But getting a 1's & 2's sequence satisfying your constraints does not look easy.
Sorry I cannot be more help.

Iniciar sesión para comentar.

Categorías

Más información sobre Introduction to Installation and Licensing en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by