i.d.d的相关性如何朱莉娅的正常数字

时间:2016-11-23 17:48:29

标签: julia

当我在julia中使用普通数字时,我在数据模拟中注意到了数据模式。

我有一组随机矩阵。为了使我的计算可重现,我设置了每个实现的virtualenv函数。也就是说,每次我使用函数srand时,我都会使用randn(n,n)对其进行初始化,其中srand(j)是实现的编号。

我想知道正常数字是如何生成的,如果它具有我做的意义,我会引入偶然的相关性。

1 个答案:

答案 0 :(得分:13)

理想情况下,完全没有。如果您有任何反例,请在Julia issue tracker上将其作为错误提交。 Julia使用最先进的Mersenne Twister图书馆dSFMT。该库非常快,并且被认为使用伪随机数生成的最佳实践。然而,最近come to my attention一般来说,像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在这里的行为并不比其他语言更糟糕,其中一些语言由于向后兼容性考虑而默认使用更糟糕的随机数生成器。这是最近的一项研究结果(甚至尚未公布)。我建议的技术也可以用来缓解其他语言中的这个问题。