2011-07-27 125 views
1

我正在使用java.util.LinkedList如何從列表中選擇隨機元素?

有什麼方法可以幫助我嗎?

+7

'ArrayList'可能是更好的選擇。從LinkedList獲取一個隨機元素是O(N)成本(因爲你必須從第一個元素遍歷到所選元素)。一個'ArrayList'是O(1)來訪問一個特定的元素。 –

+0

是的..我的代碼現在運行速度比以前快了近80%。謝謝!! – user482594

回答

7
int len = list.size(); 
Random randomGenerator = new Random(); 
int randomInt = randomGenerator.nextInt(len); 
+2

這只是得到一個隨機索引。使用'list.get(randomInt)'得到實際值(所有其他答案都已經說明過)。 – dacwe

+0

同意。問題是選擇了一個隨機元素,所以我停在那裏。感謝您的澄清。 –

3

如果你只需要一個元素,你可以使用Random類來生成(僞)隨機值(如你在你的問題中寫道):

E element = list.get(new Random().nextInt(list.size())); 

記住LinkedList.get(index)複雜度爲O(n)的操作,正如在評論中指出的那樣,最好使用ArrayList來達到這個目的。

如果你想洗牌整個陣列可以使用Collections API這樣的:

Collections.shuffle(list); 
0

獲取列表長度size(),0和大小-1之間創建一個隨機數使用get(index)來檢索具有該索引的元素。

3

您也可以使用Collections.shuffle隨機洗牌List並每次選擇第一個元素,雖然這可能是一個昂貴的計算明智。只是另一個你應該知道的技巧。 :-)

final List<String> lst = Arrays.asList("a", "b", "c"); 
Collections.shuffle(lst); 
final String rndStr = lst.get(0); 
+3

雖然你可以做到這一點(如果你需要多個元素,這是一種有用的技術),但與僅僅查看元素相比,它相當昂貴。 –

+0

同意,因此我在帖子中提到這種技術在計算上花費很大。 –

0

如果您確實只需要一個元素,請使用dacwe的解決方案。如果您需要多個值(例如模擬紙牌遊戲,賓果等)時,您可以使用java.util.Collections.shuffle(list);,併爲您需要的每個元素撥打list.remove(0);