Collections.shuffle()是否随机列表?
问题描述:
List<String> list = new ArrayList<>();
...
Collections.shuffle(list);
shuffle return void这是否意味着参数'list'在内部被改变,即在调用之后,'list'已经被随机化了?这听起来像是一个获取集合的随机样本的好方法。通常,我不必编写自己的随机化函数。不是吗?Collections.shuffle()是否随机列表?
答
是的,Collections
的shuffle
方法确实打乱到位的ArrayList
,这也适用于任何其他Collection
你传递给方法。对于那里的许多其他方法也是如此,例如sort
。
此实现向后遍历列表,从最后一个元素到第二,随机选择的元素重复交换到“当前位置”。元素是从列表中从第一个元素到当前位置(包含)的部分随机选择的。
而且也非常重要:
如果指定列表没有实现RandomAccess接口和大,这个实现将指定列表转储到一个数组改组之前,并转储洗牌阵列回到列表中。
例如,这可能是LinkedList
的情况。
还有一个变种,如果你想拥有在播种例如更多的控制权,也看到了official documentation,需要一个Random
对象。
要回答你的最后一个问题,是的,它是,如果你想有一个给定集合的随机排列,以使用该方法是一个好主意。实施非常有效。但是对于一些特殊的集合,如果真的有必要,你可以编写一个更高效的方法。
为此,我建议看看Collections#shuffle
的执行情况,如here。
是的。它已经到位。正确。 –
是的,该方法独立工作,随机函数更高效。随机算法是随机选择一个未被选中的元素。例如,如果选择位置2处的元素,则它可以与位置2处的所有元素交换直到位置n-1(因为列表/阵列具有0-n-1个位置)。 – Tehmina
你检查了文档吗? – shmosel