从multiset生成随机集

时间:2013-11-22 12:37:04

标签: java algorithm random

我有N个项目,有重复项:

List<Item> items;

我想将它们放在m个大小的集合中,其中所有项目必须是不同的。

我尝试使用Guava's Multiset

HashMultiset<Item> multiset = HashMultiset.create(items);
List<List<Item>> distribution = new ArrayList<>();
for(int i=0;i<N/m;i++){
    Set<Item> unique = multiset.elementSet();
    List<Item> randomized = new ArrayList<>(unique);
    Collections.shuffle(randomized);
    List<Item> pack = new ArrayList<>();
    for(int j=0;j<m;j++){
        pack.add(randomized.get(j));
    }
    for(int j=0;j<m;j++){
        multiset.remove(randomized.get(j));
    }
    distribution.add(pack);
}

此方法生成唯一的项目组合,直到最后,没有唯一的元素留在最后几个包中。所以它失败了数组越界异常。

我知道这个算法可以修改为接受非唯一包,但我的问题是如何产生完全独特的分发?

对于直观表示,以下是项目的示例列表:(N = 30,m = 3) A,A,A,A,A,B,B,B,B,C,C,C,C,C,C,C,d,d,d,d,E,E,E,F,F, F,F,F,F,F

达到产量: [A,B,F] [B,D,F] [B,D,F] [A,D,E] ...... [F,F,C](注意最后一个不是内部唯一的)

预期产量: [A,B,F] [B,D,F] [B,D,F] [F,D,E] ... [A,F,C]

0 个答案:

没有答案