Исправление seed с помощью srand() приводит к отличным результатам от rand ()
В моем скрипте Julia 0.5 я использую srand(1234) для получения одинаковых результатов от rand() каждый раз, когда я перезапускаю скрипт. Однако я получаю разные результаты. Что я не прав?
2 ответа
В дополнение к ответу @niczky12 я бы порекомендовал вам определить свой собственный генератор и использовать его для лучшей воспроизводимости, чтобы вы всегда сохраняли контроль над "вашим" генератором и обращались к другим функциям (возможно, не под вашим контролем), которые использование глобального не повлияет на случайные числа, которые вы получите.
Например, создание MersenneTwister
с семенами 1234:
rng = MersenneTwister(1234)
Затем вы просто передаете этот генератор вашему rand
звонки:
julia> rng = MersenneTwister(1234);
julia> rand(rng)
0.5908446386657102
julia> rand(rng, 2, 3)
2×3 Array{Float64,2}:
0.766797 0.460085 0.854147
0.566237 0.794026 0.200586
Как отметил @Dan Getz в комментариях, это, вероятно, связано с тем, что у вас есть некоторый код, который вызывает случайные функции, а вы об этом не знаете.
Если вы звоните то же самое rand()
Функция с тем же набором семян, вы получите те же результаты, как и ожидалось:
julia> for i in 1:3
srand(1)
println(rand())
end
0.23603334566204692
0.23603334566204692
0.23603334566204692
Однако, если у вас есть другой вызов в вашем скрипте, который может быть вызван или не вызван, тогда ваш генератор случайных чисел будет на разных этапах, когда вы доберетесь до исследованного rand()
вызов. Вот пример, чтобы проиллюстрировать это:
julia> for i in 1:3
srand(1)
if i == 2
rand()
end
println(rand())
end
0.23603334566204692
0.34651701419196046
0.23603334566204692
Обратите внимание, что во второй итерации цикла есть дополнительный rand()
вызов, который смещает генератор случайных чисел и приводит к другому значению.