How can I generate a vector of 19 numbers in such a way that all 19 numbers are repeated 10 times, but 10 consecutive numbers are not equal?
1 visualizzazione (ultimi 30 giorni)
Mostra commenti meno recenti
So far, the code I have is this:
nTargs = 19;
pairs = nchoosek(1:nTargs, 10);
nPairs = size(pairs, 1);
order = randperm(nPairs);
values=randsample(order,19);
targs=pairs(values,:);
Alltargs=false;
while ~Alltargs
targs=pairs(randsample(order,19),:);
B=[];
for i=1:19
G=length(find(targs==i))==10;
B=[B G];
end
if sum(B)==19
Alltargs=true;
end
end
The computation time was a huge issue, there has to be a nicer way to do this. I also thought about generating all of the values and then doing some sort of rearrangement, but that was not fruitful. Code for that is below
N=[];
for i=1:10
N=[N randperm(19)];
end
B=[];
for j=1:19
if length(unique(N(j*10-9:j*10)))<10
B=[B 1];
end
end
B
Thanks for any input.
2 Commenti
Walter Roberson
il 4 Feb 2014
Modificato: Walter Roberson
il 4 Feb 2014
When you say "but 10 consecutive numbers are not equal", do you mean that no sequence of 10 digits is exactly the same as any other sequence of 10 digits, or do you mean that in every sequence of 10 digits, no digit is repeated?
Risposta accettata
Niklas Nylén
il 4 Feb 2014
Modificato: Niklas Nylén
il 4 Feb 2014
My suggestion is to start with any valid vector according to your constraints. In the example below I have chosen the most obvious one which is 1,2,3,...,18,19,1,2,...
The next step is to move around the numbers in a way that always will end up with a valid vector but still introduces some randomness. One way to do that is to take a random index and switch place with its neighbor, if the move results in a vector which fulfills the constraints. Since we know that the old vector is valid it is only necessary to check exactly +- 10 indexes from the random position.
y = repmat(1:19,1,10);
% Run enough iterations to get the output random enough, I selected 100000
for ii = 1:100000
% Select random index
index = randi(length(y)-1);
% Check if it is allowed to switch places
if y(index)~=y(min(index+10, length(y))) && y(index+1)~=y(max(1,index-9))
% Make the switch
yTmp = y(index);
y(index)=y(index+1);
y(index+1)=yTmp;
end
end
My code runs in ~0.5 s with 100 000 iterations, of which approximately 85 000 result in a valid move.
Più risposte (0)
Vedere anche
Categorie
Scopri di più su Matrices and Arrays in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!