2011-07-27 91 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);