当我在朱莉娅中使用正常数字时,我注意到在数值模拟中我的数据中有一个模式.
我有一组随机矩阵.为了使我的计算可重现,我设置了srand每个实现的功能.也就是说,每次我使用函数时我都用randn(n,n)它初始化它srand(j),其中j是实现的数量.
我想知道正常数字是如何生成的,如果它有意义我做了什么,我会引入偶然的相关性.
Ste*_*ski 14
理想情况下,完全没有.如果您有任何反例,请在Julia 问题跟踪器上将其作为错误提交.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)
Run Code Online (Sandbox Code Playgroud)
换句话说,使用强加密散列(如SHA2-256)散列小整数种子值的字符串表示,并使用生成的散列数据来播种Mersenne Twister状态.Ottoboni,Rivest&Stark建议对每个随机数生成使用强加密哈希,但这将是一个大幅减速(在当前硬件上)并且可能有点过分,除非你有一个对不完美的统计随机性非常敏感的应用程序.
我或许应该指出,Julia在这里的行为并不比其他语言更糟糕,其中一些语言由于向后兼容性考虑而默认使用更糟糕的随机数生成器.这是最近的一项研究结果(甚至尚未公布).我建议的技术也可以用来缓解其他语言中的这个问题.
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |