2014-11-25 33 views
5

我有由現在退休僱員產生了一些代碼工作取得了一些只需要幾位,我有一個關於隨機數很少的一些奇怪的事情。在某些時候,他將由PRNG 10位返回的值向右移動,然後在該值上使用掩碼。它是安全的,從一個梅森倍捻機

我已經在互聯網上看到一些PRNG具有較差的隨機性特性,它們生成的數字中有一些位(像最後一個,只是在1和0之間交替),但是我搜索了是否存在某些litterture Mersenne Twister出現這樣的問題,但我還沒有發現任何問題。有人知道這件事嗎?

+0

此代碼的主要是產生高斯噪聲,所以RAU由瑞利表服用,索引是移位和掩模數,而TETA從相同的隨機數取,但這次只掩蔽,不移動。 – Loufylouf 2014-11-25 14:33:46

+0

在C++ 11中,聲明一個乾淨的高斯生成器需要兩行代碼。如果C++ 11是一個選項,用STL替換所有舊的,不失效的自定義生成器可能是一個不錯的選擇。 – galinette 2014-11-25 16:05:20

+0

好觀看:http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful – galinette 2014-11-25 16:06:45

回答

1

通常情況下,任何一點應該是隨機的,這是梅森捻線機的屬性。

但是(我不知道MT得很深),你可能有一些位之間的長期依賴。 建議使用庫函數來設置整數範圍,而不是自己排列這些位,否則您永遠不會知道它可能獲得的複雜屬性。

如果您使用C++ 11標準庫,只使用std :: mt19937在一起的std :: uniform_int_distribution

-1

我不知道梅森倍捻機特別,但想到什麼是典型的在嘗試獲得範圍[0,n)內的隨機整數時得到的建議。如果你有一個PRNG返回整數具有更大的範圍比N,你不應該使用模,以減少類似

x = rand() % n; 

範圍,但應該重新調整數

x = (int) floor(((double) rand())/((double) RAND_MAX)) * n); 

代替。原因是僞隨機數的最重要的位通常比較小的位更隨機,所以儘管模操作保持了很好的並且沒有浮點,但它也丟棄了那些寶貴的重要位。

雖然我不知道你提到的代碼試圖做什麼,但可能是右移加掩碼可能是以減少最低有效位的方式來減少隨機數的範圍。

+0

我的猜測是,他知道自己是被利用PRNG與前幾位隨機性較差的特性,所以他轉向這個數字用面膜上的數字「最隨機」位。但不幸的是,這只是一個猜測。 – Loufylouf 2014-11-25 14:32:10

+0

這只是絕對低劣的PRNGs(通常是'rand()')的情況。但是,適當的選擇是遷移到更好的PRNG,而不是拋光爛泥。即使像Mersenne Twister這樣普通的PRNG,這也不是問題。 – CodesInChaos 2014-11-25 14:32:53

+0

我只是想幫助回答一個問題。問題是關於'C'和其他員工_退休,PRNG可能不是最好的假設是有效的。關於更新/編寫新代碼的建議,我只是建議使用像GSL這樣的庫。 – 2014-11-25 15:11:15