In MATLAB, I would like to generate n
pairs of random integers in the range [1, m]
, where each pair is unique. For uniqueness, I consider the order of the numbers in the pair to be irrelevant such that [3, 10]
is equal to [10, 3]
.
Also, each pair should consist of two distinct integers; i.e. [3, 4]
is ok but [3, 3]
would be rejected.
EDIT: Each possible pair should be chosen with equal likelihood.
(Obviously a constraint on the parameters is that n <= m(m-1)/2
.)
I have been able to successfully do this when m
is small, like so:
m = 500; n = 10; % setting parameters
A = ((1:m)'*ones(1, m)); % each column has the numbers 1 -> m
idxs1 = squareform(tril(A', -1))';
idxs2 = squareform(tril(A, -1))';
all_pairs = [idxs1, idxs2]; % this contains all possible pairs
idx_to_use = randperm( size(all_pairs, 1), n ); % choosing random n pairs
pairs = all_pairs(idx_to_use, :)
pairs =
254 414
247 334
111 146
207 297
45 390
229 411
9 16
75 395
12 338
25 442
However, the matrix A
is of size m x m
, meaning when m
becomes large (e.g. upwards of 10,000), MATLAB runs out of memory.
I considered generating a load of random numbers randi(m, [n, 2])
, and repeatedly rejecting the rows which repeated, but I was concerned about getting stuck in a loop when n
was close to m(m-1)/2
.
Is there an easier, cleaner way of generating unique pairs of distinct integers?