Как соотносятся i.d.d. нормальные числа в джулии

Я заметил при выполнении численного моделирования образец в моих данных, когда я использую обычные числа в julia.

У меня есть ансамбль случайных матриц. Чтобы сделать мои расчеты воспроизводимыми, я установил функцию srand для реализации. То есть каждый раз, когда я использую функцию randn(n,n), я инициализирую ее с помощью srand(j), где j - номер реализации.

Я хотел бы знать, как генерируются нормальные числа, и если у него есть смысл делать то, что я делаю, я ввожу случайные корреляции.

Ответ 1

В идеале, совсем нет. Если у вас есть какие-либо контрпримеры, пожалуйста, напишите их как ошибки на странице Julia отслеживать проблемы. Джулия использует современную библиотеку Mersenne Twister, dSFMT. Эта библиотека очень быстро и считается, что она использует лучшие практики для генерации псевдослучайных чисел. Однако в последнее время приходит к моему вниманию, что могут быть тонкие статистические проблемы с PRNG, такими как MT вообще - в частности, с использованием небольших, последовательные значения семян. Чтобы смягчить это, если вы действительно обеспокоены потенциальными корреляциями, вы можете сделать что-то вроде этого:

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)

Другими словами, hash представляет собой строковое представление маленького целочисленного значения семени с использованием сильного криптографического хэша, такого как SHA2-256, и использует полученные хеш-данные для извлечения состояния Mersenne Twister. Оттобони, Ривест и Старк предлагают использовать сильный криптографический хеш для каждой генерации случайных чисел, но это будет серьезное замедление (на текущем оборудовании) и, вероятно, будет чрезмерным, если у вас нет приложения, которое действительно очень чувствительно к несовершенной статистической случайности.

Я должен, возможно, указать, что поведение Джулии здесь не хуже, чем другие языки, некоторые из которых по умолчанию используют намного худшие генераторы случайных чисел из-за соображений обратной совместимости. Это очень недавний результат исследования (еще не опубликованный). Предлагаемый метод может быть использован для смягчения этой проблемы на других языках.