【发布时间】:2013-03-25 11:06:25
【问题描述】:
在 MATLAB 中,我想生成 n 范围内的随机整数对 [1, m],其中每一对都是唯一的。为了唯一性,我认为这对中数字的顺序无关紧要,因此[3, 10] 等于[10, 3]。
此外,每一对应该由两个不同的整数组成;即[3, 4] 可以,但[3, 3] 会被拒绝。
编辑:每个可能的配对都应该以相同的可能性被选择。
(显然对参数的约束是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 变大(例如超过10,000)时,MATLAB 会耗尽内存。
我考虑生成大量随机数randi(m, [n, 2]),并反复拒绝重复的行,但我担心当n 接近m(m-1)/2 时会陷入循环。
有没有一种更简单、更简洁的方法来生成唯一的不同整数对?
【问题讨论】:
-
嗯,你有没有试过用
unique(round(rand(n+20,2)*m),'rows')生成一个A,测试长度是否至少为n(如果不是,则重复该过程),然后选择第一个@ 987654338@ 行?这可能会慢一些,但值得一试 -
@jucestain 是的,我确实考虑过这一点——我在倒数第二段中提到了这种方法。我担心的是,如果 n 非常大,算法将不得不重复循环,直到它有效地偶然找到每一对。