2017-08-12 38 views
-3
List<String> list = new ArrayList<>(); 
... 
Collections.shuffle(list); 

shuffle return void这是否意味着参数'list'在内部被改变,即在调用之后,'list'已经被随机化了?这听起来像是一个获取集合的随机样本的好方法。通常,我不必编写自己的随机化函数。不是吗?Collections.shuffle()是否随机列表?

+3

是的。它已经到位。正确。 –

+0

是的,该方法独立工作,随机函数更高效。随机算法是随机选择一个未被选中的元素。例如,如果选择位置2处的元素,则它可以与位置2处的所有元素交换直到位置n-1(因为列表/阵列具有0-n-1个位置)。 – Tehmina

+3

你检查了文档吗? – shmosel

回答

1

是的,Collectionsshuffle方法确实打乱到位的ArrayList,这也适用于任何其他Collection你传递给方法。对于那里的许多其他方法也是如此,例如sort


official documentation

此实现向后遍历列表,从最后一个元素到第二,随机选择的元素重复交换到“当前位置”。元素是从列表中从第一个元素到当前位置(包含)的部分随机选择的。

而且也非常重要:

如果指定列表没有实现RandomAccess接口和大,这个实现将指定列表转储到一个数组改组之前,并转储洗牌阵列回到列表中。

例如,这可能是LinkedList的情况。

还有一个变种,如果你想拥有在播种例如更多的控制权,也看到了official documentation,需要一个Random对象。


要回答你的最后一个问题,是的,它是,如果你想有一个给定集合的随机排列,以使用该方法是一个好主意。实施非常有效。但是对于一些特殊的集合,如果真的有必要,你可以编写一个更高效的方法。

为此,我建议看看Collections#shuffle的执行情况,如here