2014-02-27 93 views
3

讓我盡我所能解釋我的問題,好吧,說我們有一個Random類用特定的種子構建。在這一點上,我們可以使用.next()方法來獲取從種子派生的下一個值。Java隨機序列

我似乎需要一種方法來從這個序列中獲取值,而不是爲了。例如,如果Random有一個類似.get(X)的方法,它將返回第X個調用.next()時的值。

我能想到的一種方法是使用for循環X次,在每個循環中調用.next()但不分配變量。這不會很好,因爲A.性能和B.它將隨機序列留在X處,這意味着如果你的下一個X比原來的X小,你將不得不重構Random

下面是我想解決這個問題的另一種方法。也許你可以從舊種子和X中派生一個臨時的新種子,一次調用next()並存儲該值,然後將Random返回到其原始種子。我不知道從兩個值中獲得這個新種子的典型方式,可能是一些瘋狂的按位操作。我對這種方法的所有嘗試都沒有足夠的隨機性。

恩,謝謝你的幫助!

+1

你正在追逐一個虛假的目標。在一個好的隨機生成器中,.next()與.get(X)是無法區分的。如果標準Random對你來說足夠好,你不需要.get(X)。如果不是,則.get(X)將與.next()一樣差。 –

+0

你如何得出結論:使用for循環方法不會因爲性能和(B)你的問題的原因而工作? – swapnil7

+1

絕對沒有理由關閉。完美的問題。 – Basilevs

回答

4

您可以爲您的Random對象創建一個緩存。我的意思是創建一個最初爲空的ArrayList。然後創建使用ArrayList和Random對象的get(X)方法。當調用get(X)時,可以調用Random的next()方法X次,並將它生成的X值寫入ArrayList。然後返回最後一個值。

下一次的get()被調用,參數Y,你可以比較Y到你的ArrayList的長度。如果它小於列表的長度(Y小於X),那麼你已經在早些時候計算出了這個值,你可以在ArrayList中查找它並返回它。如果Y大於列表的長度,那麼通過調用Random的next()方法足夠多的次數來獲得Y來增長ArrayList。

您需要一些內存,但它可以讓您返回,並且運行時間將會像您見過的最大的X一樣慢。

+1

更簡單的方法是預先生成一大堆隨機數(就像您在程序中需要的那樣),然後將它們存儲在一個數組中。然後,只需在陣列中查找它們就可以了。 – Abednego

+0

這是一個好主意,到目前爲止我最喜歡你的。我確實做了一些搜索,並且發現它類似(我認爲,不知道他的目的是否與我的距離很近)問題:bit.ly/1hu6T59您認爲該答案中的代碼可能會給我預期的效果? –

-2

我的一個朋友曾經告訴我,我們真的不能在計算機隨機值的任何隨機值生成方法將基於一個邏輯算法。

import java.util.Random; 

Random random = new Random(System.currentTimeMillis()); 

// Example 
int randomInt = random.nextInt(500); [Returns value between 0(inclusive) and 500 (exclusive)] 
And so goes the other methods. 

由於時間不重複,調用System.currentTimeMillis()並把它當作隨機種子將是你最好的選擇。它最常見的做法。

以任何方式,你仍然可以得到一個僞隨機數,不管你用什麼算法。
你必須觀察物理過程才能獲得真正的隨機數。

+0

-1問題詢問預先序列發生器,沒有請求物理隨機性 – Basilevs

+0

請閱讀該問題,seed _should not_ be random! – Basilevs

+0

從什麼時候種子變成隨機的?:D但是,誠實而誠懇地說,我不能在問題的任何地方看到OP在哪裏說種子不應該是隨機的。 –