2014-02-11 220 views
1

我有一個ArrayList,我想從中獲取一個隨機值。要做到這一點,我想到了兩個簡單的方法:隨機與隨機

方法1:使用Random生成介於0和ArrayList大小的隨機數,然後使用該號碼arrayList.get(x)

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

在隨機性方面,一種方法比另一種方法更可取,我知道一個方法不可能是真正隨機的,但我希望結果儘可能隨機。

編輯:我只需要從ArrayList

+0

這兩種方法都是可以接受的,我想。 –

回答

9

這取決於上下文。洗牌的

優點:

  • 一旦洗牌,然後就連續抓
  • 沒有重複的值

優點隨機的:

  • 偉大的少量值
  • 可以重複val UE的
+0

我做了一個編輯,說明我只需要一個值,而我只需要這個值一次。 –

+0

@ rsay3:你會需要另一個隨機值或有沒有考慮以前的值?如:在下一個必須選擇的值是否可以選擇一次?如果沒關係:看看你想要多少。如果你仍然只需要一小筆錢,那麼答案是隨機的。如果你需要少量但唯一的值,那麼你可以採用單獨的列表和一些if語句來進行隨機化,但是如果僅僅對整個列表進行洗牌並且完成它,那麼你應該這樣做。 –

+0

我的意思是我不需要任何其他的價值。我只想從ArrayList得到一個值,然後代碼段完成 –

1

一個值,我要說的是隨機數的選擇是最好的(方法1)。

改變對象會佔用額外的資源,因爲它必須移動ArrayList中的所有對象,其中生成一個隨機數可以產生相同的效果,而無需使用CPU時間循環訪問數組元素!

此外,一定要生成一個介於0和大小MINUS ONE之間的數字。 :)

1

如果你只是想一個隨機選擇,使用方法1.如果你想獲得隨機選擇的序列,沒有重複,使用方法2

3

要回答你直接的問題:沒有之一這些比另一個「更隨機」。兩種方法的結果在統計學上是不可區分的。畢竟,洗牌數組的第一步是(基本上)選取0N-1之間的數字(其中N是數組的長度)並將該元素移動到第一個位置。

也就是說,根據您的具體需求,有理由選擇一個或另一個。 Jeroen's answer總結得很好。

0

隨機性取決於兩個因素,即算法(也稱爲「生成器」)和種子。

  • 每種方法使用哪些生成器?

第二次超載Collections.Shuffle()實際上接受種子Random。如果您選擇默認過載,則使用Random,正如Javadoc中指定的。無論如何,你正在使用Random

  • 發電機是不同的?

另一個看看Javadoc中的隨機數表明,除非你指定一個種子,否則它會播種一段時間的值。如果您查看實施,Shuffle不會指定時間。除非指定一個,否則您正在使用默認種子。

因爲兩者都使用Random並且兩者使用相同的默認種子,所以它們是等同隨機

  • 哪一個具有較高的時間複雜度?

改序列表是O(n)(Shuffle的Javadoc實際上指定了線性時間)。 Random.nextInt()的時間複雜度爲O(1)。很明顯,後者在只需要一個值的情況下更快。