随机vs随机播放

时间:2014-02-11 22:31:41

标签: java random arraylist

我有一个ArrayList,我想从中获取一个随机值。为此,我想到了两个简单的方法:

方法1:使用Random生成介于0和ArrayList大小之间的随机数,然后将该数字用于arrayList.get(x)

方法2:使用arrayList.shuffle()然后使用arrayList.get(0)

在随机性方面,一种方法比另一方更优选,我知道一种方法不可能是真正随机的,但我希望结果尽可能随机。

编辑:我只需要ArrayList

中的一个值

5 个答案:

答案 0 :(得分:9)

这取决于具体情况。

改组的好处:

  • 一旦洗牌,然后顺序抓取
  • 没有重复的值

随机化的好处:

  • 非常适合少量值
  • 可以重复值

答案 1 :(得分:4)

回答你的直接问题:其中任何一个都不比另一个“更随机”。两种方法的结果在统计上无法区分。毕竟,改组数组的第一步是(基本上)在0N-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)。显然,在只需要一个值的情况下,后者更快。