2010-07-01 31 views
5

尋找一個線程安全的隨機數發生器我發現了一個梅森倍捻機發生器類,作者說,如果線程安全:線程安全的梅森難題

http://www.umiacs.umd.edu/~yangcj/mtrnd.html

但學習的代碼後,我看不出是它是安全的線。在那裏沒有任何類型的鎖或任何類似鎖變量的東西。

此實現是否真的線程安全?如果是這樣的魔術是什麼?

回答

1

從兩種不同的MersenneTwist對象可以同時使用的角度來看,它似乎是線程安全的。您不能在兩個線程中使用同一個對象,而沒有使用鎖來保護它。

我想作者談論的原始C版本使用全局或靜態變量,所以這是一個改進。

+0

我的應用程序需要在所有線程中產生隨機但唯一的數字。通過對每個線程使用不同的Mersenne Twist對象,我可以保證生成的數字的唯一性嗎? – Horacio 2010-07-01 14:24:33

+0

生成唯一的數字是一個不同的問題。此外,除非您爲每個對象提供不同的種子,否則您將獲得相同的序列。 – Amnon 2010-07-01 14:41:33

+0

只要我使用相同的mersenne對象,我會得到唯一的隨機數,直到序列重複正確?對於mersenne twister來說,這個循環經過很長時間後會重複,比我的應用程序可能需要的要大得多,所以我想我可以使用這個隨機生成器作爲唯一的id生成器。請糾正我,如果錯了。 – Horacio 2010-07-01 15:42:17

6

關於如何在Multiple stream Mersenne Twister中創建多流Mersenne Twister隨機數生成器以及http://theo.phys.sci.hiroshima-u.ac.jp/~ishikawa/PRNG/mt_stream_en.html中的實現(即Fortran 95中的源代碼)的討論。該方法在Mersenne Twister序列中廣泛分離的點處開始多個流,從而保證多個流彼此獨立並且不會產生相同的隨機數序列。不需要鎖,因此不需要並行代碼;單獨的流通過id訪問。