从整数1,...,N
我想采用k个随机的不同组合而不重复大小p
。例如,如果N=10
,k=4
和p=3
,可能的结果将是:
1 4 9
9 4 2
3 5 2
1 8 4
但不是:
1 4 9
9 4 2
3 5 3
1 9 4
有两个原因:
[1 4 9]
和[1 9 4]
是相同的组合。
[3 5 3]
并非没有重复。
请注意,获取所有可能的组合以及(随机)选择它们k
很容易遇到内存问题。
答案 0 :(得分:4)
好的,我找到了一个适合我的解决方案。我主要担心的是:
k
组合是随机的。 以下函数在每次迭代时对大小为p
(即row = randperm(N,p)
)的单个随机组合进行采样,并添加该组合(如果尚未存在)。
在这三个参数中,主要是k
会影响处理时间。对于不太大的k
,此代码在几秒钟内运行。我自己将遇到的最极端的情况是N = 10^6, k = 2000, p = 10
,它仍然会在1秒内运行。
我希望这也可以帮助其他人,因为我在多个网站上遇到过这个问题而没有一个满意的答案。
function C = kcombsn(N,k,p)
C = randperm(N,p);
Csort = sort(C,2);
while size(C,1) < k
row = randperm(N,p);
row_sort = sort(row);
if isempty(intersect(row_sort,Csort,'rows'))
C = [C; row];
Csort = [Csort; row_sort];
end
end
end