我有一个ArrayList
,我想从中获取一个随机值。为此,我想到了两个简单的方法:
方法1:使用Random
生成介于0和ArrayList
大小之间的随机数,然后将该数字用于arrayList.get(x)
方法2:使用arrayList.shuffle()
然后使用arrayList.get(0)
。
在随机性方面,一种方法比另一方更优选,我知道一种方法不可能是真正随机的,但我希望结果尽可能随机。
编辑:我只需要ArrayList
答案 0 :(得分:9)
这取决于具体情况。
改组的好处:
随机化的好处:
答案 1 :(得分:4)
回答你的直接问题:其中任何一个都不比另一个“更随机”。两种方法的结果在统计上无法区分。毕竟,改组数组的第一步是(基本上)在0
和N-1
之间选择一个数字(其中N
是数组的长度)并将该元素移动到第一步位置。
话虽如此,根据您的具体需求,有正当理由选择其中一个。 Jeroen's answer总结了这些。
答案 2 :(得分:1)
我会说随机数选项是最好的(方法1)。
对对象进行混洗会占用额外的资源,因为它必须在ArrayList中移动所有对象,其中生成随机数可以获得相同的效果,而无需使用CPU时间来循环遍历数组元素!
另外,请务必生成介于0和MINUS ONE之间的数字。 :)
答案 3 :(得分:1)
如果您只想要一个随机选择,请使用方法1.如果您想获得一系列没有重复的随机选择,请使用方法2.
答案 4 :(得分:1)
随机性取决于两个因素,即算法(a.k.a“生成器”)和种子。
Collections.Shuffle()
的第二次重载实际上接受了种子Random
。如果您选择默认重载,它会使用Random
无论如何,如Javadoc中所指定。无论如何,您都在使用Random
。
再看看Javadoc中的Random,除非你指定种子,否则它会被一些时间值播种。如果查看实现,Shuffle不会指定时间。除非您指定一个,否则您将使用默认种子。
因为两者都使用Random
并且都使用相同的默认种子,所以它们同等随机。
混洗列表是O(n)(Shuffle的Javadoc实际上指定了线性时间)。 Random.nextInt()的时间复杂度为O(1)。显然,在只需要一个值的情况下,后者更快。