hello123
hello123

Reputation: 313

Generate cell with random pairs without repetitions

How to generate a sequence of random pairs without repeating pairs? The following code already generates the pairs, but does not avoid repetitions:

for k=1:8
    Comb=[randi([-15,15]) ; randi([-15,15])];
    T{1,k}=Comb;
end

When running I got:

T= [-3;10] [5;2] [1;-5] [10;9] [-4;-9] [-5;-9] [3;1] [-3;10]

The pair [-3,10] is repeated, which cannot happen.

PS : The entries can be positive or negative.

Is there any built in function for this? Any sugestion to solve this?

Upvotes: 0

Views: 198

Answers (3)

rahnema1
rahnema1

Reputation: 15867

You can use ind2sub:

n = 15;
m = 8;
[x y]=ind2sub([n n],randperm(n*n,m));

Upvotes: 2

Luis Mendo
Luis Mendo

Reputation: 112749

If you have the Statistics Toolbox, you can use randsample to sample 8 numbers from 1 to 31^2 (where 31 is the population size), without replacement, and then "unpack" each obtained number into the two components of a pair:

s = -15:15; % population
M = 8; % desired number of samples
N = numel(s); % population size
y = randsample(N^2, M); % sample without replacement
result = s([ceil(y/N) mod(y-1, N)+1]); % unpack pair and index into population

Example run:

result =
    14     1
    -5     7
    13    -8
    15     4
    -6    -7
    -6    15
     2     3
     9     6

Upvotes: 2

skm
skm

Reputation: 371

Two possibilities:

1.

M = nchoosek(1:15, 2);
T = datasample(M, 8, 'replace', false);

2.

T = zeros(8,2);
k = 1;
while (k <= 8)
  t = randi(15, [1,2]);
  b1 = (T(:,1) == t(1));
  b2 = (T(:,2) == t(2));
  if ~any(b1 & b2)
    T(k,:) = t;
    k = k + 1;
  end
end

The first method is probably faster but takes up more memory and may not be practicable for very large numbers (ex: if instead of 15, the max was 50000), in which case you have to go with 2.

Upvotes: 1

Related Questions