2008-11-25 60 views
2

當使用隨機數發生器,這是使用它的新價值較大的隨意性更好的辦法:隨機數發生器:級別或方法級別?

  1. 有實例每次RNG的一個新實例,然後一個方法返回一個值?

  2. 在類級別有一個RNG實例,它在構造函數中實例化一次,並且所有後續調用使用現有實例的新隨機值?

問題是,可能有很多隨機數的調用,通常在不同的範圍內沒有相互連接。

這不是一個性能問題,所以實際上每個調用可能實例化一個新的實例沒有什麼區別。這完全是關於返回值的隨機性。

+0

我實際上創建了一個java類,它隨機數或一組隨機數查詢random.org。如果有人有興趣,請告訴我。 – Relequestual 2009-07-22 21:24:02

回答

3

編輯︰我相信我的意思是選項3,如另一個答案,即全球隨機管理器中提到的,雖然在一個特定的類你可以做到完全相同的事情。

使用選項2的另一個優點是,如果您在軟件中需要「重放」功能,則可以簡單地存儲用於初始化RNG的種子。接下來的時間,你只需要強制RNG使用存儲的種子,你會得到完全相同的一組行爲,假設有沒有其他問題,如併發/線程這可能會改變執行的順序。

你可能想,如果你的軟件運行需要大量隨機的實驗,做這樣的事情,但是,你可能希望重複一個特定的運行展示給其他人。它也用於很多電腦遊戲中,AI將根據可能的選擇權重作出決定,但最終隨機數字「挑選」他們採取的行動。

這也使得調試可能只出現短暫的偶然的錯誤。如果您不存儲每次運行的種子,則無法重新創建導致錯誤的確切條件。

+0

在模擬中,這種技術被稱爲「普通隨機數」,並且可以在適當的情況下,在兩個系統之間進行比較,以相同的有效性和較少的採樣進行比較。 – 2008-11-25 16:45:10

8

實際上,選項1不起作用。

選項2是唯一的選擇。 RNG絕對要求您從單個種子開始依次生成值。

你「創建一個新的發電機用新種子」打破了數學基礎。你得到的東西完全取決於你的種子,可惜 - 不會很隨意。

+0

請參閱http://stackoverflow.com/questions/203382/do-stateless-random-number-generators-exist#203646和http:// stackoverflow。com/questions/295628/securerandom-init一次或每次都需要 – 2008-11-25 11:42:05

4

我建議選項3:在整個程序中使用一個RNG。如果RNG不是線程安全的(例如.NET),它需要鎖定或線程本地化,但它使生活變得更簡單,並且不需要擔心重複。

的.NET StaticRandom類我寫了這個目的的詳情,請參閱the relevant MiscUtil page。 (這很簡單 - 根本沒有什麼聰明)

+0

同意。您僅需要將RNG播種一次(意味着使用一個全局實例)。 – orip 2008-11-25 11:43:52

相關問題