Исправление 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() вызов, который смещает генератор случайных чисел и приводит к другому значению.

Другие вопросы по тегам