k没有替换的大小为p的明显组合

时间:2016-01-13 12:54:48

标签: matlab random numbers combinations

从整数1,...,N我想采用k个随机的不同组合而不重复大小p。例如,如果N=10k=4p=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. [1 4 9][1 9 4]是相同的组合。

  2. [3 5 3]并非没有重复。

  3. 请注意,获取所有可能的组合以及(随机)选择它们k很容易遇到内存问题。

1 个答案:

答案 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

修改 我也是posted the code on the MATLAB File Exchange