2016-11-23 61 views
10

當我在茱莉亞使用正常數字時,我在數據模擬中注意到了數據中的一種模式。i.d.d如何相關?在茱莉亞的正常數字

我有一個隨機矩陣的系綜。爲了使我的計算可重現,我設置了每個實現的srand函數。也就是說,每次我使用函數randn(n,n)我用srand(j)初始化它,其中j是實現的數量。

我想知道正常數字是如何生成的,如果它具有做我所做的意義,我會引入意外相關性。

回答

15

理想情況下,沒有。如果您有任何反例,請將它們作爲Julia issue tracker上的錯誤提交。 Julia使用最先進的Mersenne Twister圖書館,dSFMT。這個庫非常快,並且被認爲是使用僞隨機數生成的最佳實踐。然而,最近有一些關於MT的PRNG可能存在微妙的統計問題 - 特別是在使用小的連續種子值時。爲了緩解這個,如果你真的很擔心潛在關係,你可以做這樣的事情:

julia> using SHA 

julia> srand(reinterpret(UInt32,sha256(string(1)))) 
MersenneTwister(UInt32[0x73b2866b,0xe1fc34ff,0x4e806b9d,0x573f5aff,0xeaa4ad47,0x491d2fa2,0xdd521ec0,0x4b5b87b7],Base.dSFMT.DSFMT_state(Int32[660235548,1072895699,-1083634456,1073365654,-576407846,1073066249,1877594582,1072764549,-1511149919,1073191776 … -710638738,1073480641,-1040936331,1072742443,103117571,389938639,-499807753,414063872,382,0]),[1.5382,1.36616,1.06752,1.17428,1.93809,1.63529,1.74182,1.30015,1.54163,1.05408 … 1.67649,1.66725,1.62193,1.26964,1.37521,1.42057,1.79071,1.17269,1.37336,1.99576],382) 

julia> srand(reinterpret(UInt32,sha256(string(2)))) 
MersenneTwister(UInt32[0x3a5e73d4,0xee165e26,0x71593fe0,0x035d9b8b,0xd8079c01,0x901fc5b6,0x6e663ada,0x35ab13ec],Base.dSFMT.DSFMT_state(Int32[-1908998566,1072999344,-843508968,1073279250,-1560550261,1073676797,1247353488,1073400397,1888738837,1073180516 … -450365168,1073182597,1421589101,1073360711,670806122,388309585,890220451,386049800,382,0]),[1.5382,1.36616,1.06752,1.17428,1.93809,1.63529,1.74182,1.30015,1.54163,1.05408 … 1.67649,1.66725,1.62193,1.26964,1.37521,1.42057,1.79071,1.17269,1.37336,1.99576],382) 

換句話說,哈希使用強密碼散列像SHA2-256小整數種子值的字符串表示,並使用生成的哈希數據來播種Mersenne Twister狀態。 Ottoboni,Rivest & Stark建議爲每個隨機數生成一個強大的加密哈希,但這將是一個巨大的減速(在當前的硬件上),可能是過度殺毒,除非你有一個應用程序對非完全統計隨機性非常敏感。

我也許應該指出,由於後向兼容性的考慮,Julia在這裏的行爲並不比其他語言糟糕,其中一些默認情況下會使用更差的隨機數生成器。這是一個最近的研究成果(甚至還沒有發表)。我建議的技術也可以用來緩解其他語言中的這個問題。

+0

讓我與我的顧問討論您的答案,因爲我正在攻讀博士學位,因此我們正在繪製尚未發佈的新成果,並擔心在公共場所發佈新的潛在新創意。如果需要,是否有機會親自與您聯繫? – user2820579

+3

此外,它使用Ziggurat算法(https://en.wikipedia.org/wiki/Ziggurat_algorithm)從統一編號生成正態變量 –

+1

當然,請隨時直接與我聯繫。 – StefanKarpinski