2017-08-12 37 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