Collections.shuffle(List list)

6
什么情况下会使用这种方法?
更新:我现在明白了。我喜欢Uri的理由:“洗牌不是一个简单的算法”。这是非常正确的。
4个回答

12

有很多理由会导致人们想要随机洗牌一个有序的元素序列,例如一副牌。

洗牌不是一个简单的算法,就像排序一样。因此,它很常见,需要一个库函数。

至于为什么使用列表 - 显然必须是有序集合,因此不能是任何一般的集合。只有列表及其子类型可以保证按顺序排列。Collections类不提供数组操作,但您可以(而且可能应该,为了性能)将一个ArrayList传递给这个方法。


实际上,这个实现非常简单。每个元素都会获得一个新的索引,如果插槽已经被占用,集合(或迭代器)会计算下一个空闲插槽。 - Andreas Dolk
@Andreas_D,不要低估它,你必须小心地使用一个算法,使得所有排列的可能性相等,因此这并不完全是琐事 - 请参见http://en.wikipedia.org/wiki/Fisher-Yates_shuffle。 - Jesper
刚刚查看了Collections中的实际实现。在那里,它被相当轻松地解决了。但也许不是最优解。 - Andreas Dolk
我曾经在面试中看到过排列算法,所以它绝对不是完全平凡的。即使我知道如何编写快速排序,我也会使用Collections.sort()。 - Uri

5

如果你有一个集合,并且想要将其洗牌...

最明显的例子就是纸牌游戏,其中你有代表每张卡牌的对象,以及代表你想要洗牌的牌组的集合。

另一个例子可能是在问卷调查中向用户呈现多个答案,而你不希望由于答案的顺序而产生任何偏见-因此你向每个用户呈现一组洗牌后的答案供其选择。


1

想象一下,你正在模拟一副牌。洗牌将是你编写的第一个函数之一。

每当你想要随机化集合的内容时,你都会使用shuffle。


1

以下是一些使用此方法的想法:

  • 在游戏中洗牌
  • 在排序算法的测试用例中随机化数组
  • 在测试套件中洗牌测试用例,以确保它们不相互依赖
  • 如果您尝试解决像旅行商问题这样的NP完全问题,一种方法是将输入洗牌多次,然后使用长度最短的结果。这给出了一个运行时间为O(N)的解决方案(其中N是节点数)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接