我需要从一组n个元素中选择k个元素的随机组合,其中n可能相当大。鉴于集合的大小,仅使用combnk
或nchoosek
生成所有可能的组合并从中随机选择是不可行的。
是否有一种简单的方法可以生成这些组合中M的唯一随机子集?
当n很小时,以下工作:
M = 20; %want to pick M random combinations
n = 10; %number of elements
k = 5; %number of elements in each combination
allCombos = nchoosek([1:n], k); %for large n this is not feasible
numCombos = nchoosek(n,k);
permutationsToUse = randperm(numCombos, M);
randomCombos = allCombos(permutationsToUse, :);
当n很大时,这不再可行。
相关帖子
Retrieve a specific permutation without storing all possible permutations in Matlab
How to randomly pick a number of combinations from all the combinations efficiently?
答案 0 :(得分:2)
您可以尝试使用randi
并生成从1到Nelements的7个整数的随机组合,然后检查您是否只有唯一的组合:
Nelements=100;
M=10;
combsubset=randi(Nelements,[M 7]);
combsubset=unique(combsubset,'rows');
如果你想获得完全M组合,你可以使用循环:
Nelements=100;
M=10;
combsubset=[];
while(size(combsubset,1)<M)
combsubset=[combsubset;randi(Nelements,[M 7])];
combsubset=unique(combsubset,'rows');
end
combsusbet=combsubset(1:M,:);
如果你想重复使用它来获得其他组合,你几乎可以使用相同的代码:
Nelements=100;
Mtotal=20
M=10;
while(size(combsubset,1)<Mtotal)
combsubset=[combsubset;randi(Nelements,[M 7])];
combsubset=unique(combsubset,'rows');
end
combsusbet=combsubset(1:Mtotal,:);
编辑:您需要的另一种方法是命令组合只能获得给定的子集。可以使用以下示例解释一种对它们进行排序的方法:如果您有三个索引i,j,k,范围从0到N-1,则可以使用唯一索引n=i*N*N+j*N+k
来查看所有可能性。然后,如果你想获得第n个向量:
k=mod(n,N);
j=mod((n-k)/N,N);
i=mod((((n-k)/N)-j)/N,N);
我不知道你是否会发现这更优雅但是在一个使用递归的小函数的帮助下你很容易得到你的组合的固定子集。