В MATLAB я хотел бы генерировать пары n
случайных целых чисел в диапазоне [1, m]
, где каждая пара уникальна. Для единственности я считаю, что порядок чисел в паре не имеет значения, так что [3, 10]
равно [10, 3]
.
Кроме того, каждая пара должна состоять из двух различных целых чисел; то есть [3, 4]
, но [3, 3]
будет отклонено.
EDIT: каждая возможная пара должна быть выбрана с равной вероятностью.
(Очевидно, что ограничение параметров - это n <= m(m-1)/2
.)
Я смог успешно сделать это, когда m
невелик, например:
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
Однако матрица A
имеет размер m x m
, что означает, что когда m
становится большим (например, свыше 10000), у MATLAB заканчивается память.
Я считал создание нагрузки случайных чисел randi(m, [n, 2])
и неоднократно отклонял повторяющиеся строки, но меня беспокоило о том, что вы застряли в цикле, когда n
был близок к m(m-1)/2
.
Есть ли более простой и чистый способ генерации уникальных пар различных целых чисел?