Wydajne generowanie unikalnych par liczb całkowitych
W MATLAB chciałbym wygenerowaćn
pary losowych liczb całkowitych w zakresie[1, m]
, gdzie każda para jest wyjątkowa. Dla wyjątkowości uważam kolejność liczb w parze za nieistotną[3, 10]
jest równe[10, 3]
. Ponadto każda para powinna składać się z dwóch różnych liczb całkowitych; to znaczy[3, 4]
jest ok, ale[3, 3]
zostanie odrzucony.EDYTOWAĆ: Każda możliwa para powinna być wybrana z jednakowym prawdopodobieństwem.
(Oczywiście jest to ograniczenie parametrówn <= m(m-1)/2
.)
Udało mi się to zrobić z powodzeniemm
jest mały, tak:
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
Jednak matrycaA
ma rozmiarm x m
, czyli kiedym
staje się duży (np. ponad 10 000), w pamięci MATLAB zabraknie pamięci.
Rozważyłem generowanie obciążenia liczb losowychrandi(m, [n, 2])
i wielokrotnie odrzucając wiersze, które się powtarzały, ale martwiłem się, że utknę w pętlin
był bliskom(m-1)/2
.
Czy istnieje łatwiejszy i czystszy sposób generowania unikalnych par różnych liczb całkowitych?