List<String> list = new ArrayList<>();
...
Collections.shuffle(list);
shuffle return void這是否意味着參數'list'在內部被改變,即在調用之後,'list'已經被隨機化了?這聽起來像是一個獲取集合的隨機樣本的好方法。通常,我不必編寫自己的隨機化函數。不是嗎?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