从集合中选择随机子集的最佳方法?

我在Vector中有一组对象,我想从中选择一个随机子集(例如,返回100个项目;随机选择5个项目)。在我的第一遍(非常仓促)中,我做了一个非常简单甚至过于聪明的解决方案:

Vector itemsVector = getItems();

Collections.shuffle(itemsVector);

itemsVector.setSize(5);

尽管这样做的好处是简单好用,但我怀疑它的伸缩性不会很好,即Collections.shuffle()至少必须为O(n)。我不太聪明的选择是

Vector itemsVector = getItems();

Random rand = new Random(System.currentTimeMillis()); // would make this static to the class

List subsetList = new ArrayList(5);

for (int i = 0; i < 5; i++) {

// be sure to use Vector.remove() or you may get the same item twice

subsetList.add(itemsVector.remove(rand.nextInt(itemsVector.size())));

}

关于从集合中抽取随机子集的更好方法的任何建议?

回答:

乔恩·本特利(Jon Bentley)在“编程珍珠”或“更多编程珍珠”中对此进行了讨论。您需要小心选择N of

M的过程,但是我认为显示的代码可以正常工作。您可以只对前N个位置进行混洗,而不是对所有项目进行随机混洗-当N << M时,这是一个有用的节省方法。

Knuth还讨论了这些算法-我相信这将是第3卷“排序和搜索”,但是我的场景已经打包好,等待房屋搬迁,所以我无法正式对其进行检查。

以上是 从集合中选择随机子集的最佳方法? 的全部内容, 来源链接: utcz.com/qa/398297.html

回到顶部