2012-06-10 45 views
0

我想寫一個函數,它會被其他函數多次重複調用。在這個函數內部,它應該產生大量的隨機數,這部分將被並行處理。如果只進行一次運行,可以爲每個線程選擇不同的種子,以便隨機數不相關。但是,如果這個函數第二次被調用,那麼隨機數似乎會重複,除非在隨後的調用期間種子將被再次改變。如何在重複調用中並行生成不相關的隨機數字?

所以我的問題是,是否有生成隨機數或重置種子,以便通過重複調用這項功能,同時通過不同的線程產生的隨機數是真正隨機的好辦法?

我需要這樣做OpenMP中。每次調用函數後,是否可以爲每個線程分別存儲生成器的狀態,以便下次調用函數時,隨機數生成器從最後一個狀態開始並繼續生成不相關的數字?

謝謝。

+0

爲什麼你需要每個線程一個,爲什麼不共享相同的發電機? –

回答

0

首先使用強大的隨機數生成器像MT。爲了解決你的線程問題,使一個發生器由一個互斥體保護,這將爲每個線程產生種子。然後在每個線程上使用不同的發生器。
關鍵是初始化的,你需要的最小次數,對於你可能會需要一個程序全球對種子生成和線程的每個線程的發電機本地存儲。

+0

不幸的是,如果這是一個模擬結果需要在統計上有效,這是不夠的。 (原因在於兩個或更多個線程生成器在rng週期中恰好處於附近的開始狀態中會有很大的可能性)。你需要爲多線程問題專門尋找一個rng。當然對於像遊戲這樣的非關鍵應用程序,你提出的很好。 – Gene

+0

我應該說,並行隨機數生成是當前研究的一個主題。請參閱http://sprng.cs.fsu.edu/。希望這有幫助。 – Gene

+0

@Gene:即使沒有最佳使用,MT也是一個不錯的選擇。 – Dani