我有一個ArrayList
,我想從中獲取一個隨機值。要做到這一點,我想到了兩個簡單的方法:隨機與隨機
方法1:使用Random
生成介於0和ArrayList
大小的隨機數,然後使用該號碼arrayList.get(x)
方法2:使用arrayList.shuffle()
,然後arrayList.get(0)
。
在隨機性方面,一種方法比另一種方法更可取,我知道一個方法不可能是真正隨機的,但我希望結果儘可能隨機。
編輯:我只需要從ArrayList
我有一個ArrayList
,我想從中獲取一個隨機值。要做到這一點,我想到了兩個簡單的方法:隨機與隨機
方法1:使用Random
生成介於0和ArrayList
大小的隨機數,然後使用該號碼arrayList.get(x)
方法2:使用arrayList.shuffle()
,然後arrayList.get(0)
。
在隨機性方面,一種方法比另一種方法更可取,我知道一個方法不可能是真正隨機的,但我希望結果儘可能隨機。
編輯:我只需要從ArrayList
這取決於上下文。洗牌的
優點:
優點隨機的:
我做了一個編輯,說明我只需要一個值,而我只需要這個值一次。 –
@ rsay3:你會需要另一個隨機值或有沒有考慮以前的值?如:在下一個必須選擇的值是否可以選擇一次?如果沒關係:看看你想要多少。如果你仍然只需要一小筆錢,那麼答案是隨機的。如果你需要少量但唯一的值,那麼你可以採用單獨的列表和一些if語句來進行隨機化,但是如果僅僅對整個列表進行洗牌並且完成它,那麼你應該這樣做。 –
我的意思是我不需要任何其他的價值。我只想從ArrayList得到一個值,然後代碼段完成 –
一個值,我要說的是隨機數的選擇是最好的(方法1)。
改變對象會佔用額外的資源,因爲它必須移動ArrayList中的所有對象,其中生成一個隨機數可以產生相同的效果,而無需使用CPU時間循環訪問數組元素!
此外,一定要生成一個介於0和大小MINUS ONE之間的數字。 :)
如果你只是想一個隨機選擇,使用方法1.如果你想獲得隨機選擇的序列,沒有重複,使用方法2
要回答你直接的問題:沒有之一這些比另一個「更隨機」。兩種方法的結果在統計學上是不可區分的。畢竟,洗牌數組的第一步是(基本上)選取0
和N-1
之間的數字(其中N
是數組的長度)並將該元素移動到第一個位置。
也就是說,根據您的具體需求,有理由選擇一個或另一個。 Jeroen's answer總結得很好。
隨機性取決於兩個因素,即算法(也稱爲「生成器」)和種子。
第二次超載Collections.Shuffle()
實際上接受種子Random
。如果您選擇默認過載,則使用Random
,正如Javadoc中指定的。無論如何,你正在使用Random
。
另一個看看Javadoc中的隨機數表明,除非你指定一個種子,否則它會播種一段時間的值。如果您查看實施,Shuffle不會指定時間。除非指定一個,否則您正在使用默認種子。
因爲兩者都使用Random
並且兩者使用相同的默認種子,所以它們是等同隨機。
改序列表是O(n)(Shuffle的Javadoc實際上指定了線性時間)。 Random.nextInt()的時間複雜度爲O(1)。很明顯,後者在只需要一個值的情況下更快。
這兩種方法都是可以接受的,我想。 –