2016-11-23 43 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