Могу ли я получить .seed() как-то?
В отношении оператора set.seed()
можно ли получить семя вместо запуска некоторого кода, если я не указал его явно?
Я повторно запускаю некоторый код (интерактивно/на консоли), содержащий функцию, которая рандомизирует некоторый образец входных данных (эта функция является частью пакета kohonen
). Поиграв с ним в течение некоторого времени, чтобы увидеть разнообразие результатов (это была "нестабильная" проблема), я заметил, что один результат был довольно интересным. Я, конечно, не использовал set.seed()
, но задавался вопросом, могу ли я получить семя после запуска кода для воспроизведения результата?
В ?set.seed
я вижу
.Random.seed сохраняет набор семян для равномерного генератора случайных чисел
Но я не знаю, как это помогает.
Ответы
Ответ 1
Если вы не сохранили семя, нет общего способа "откатить" генератор случайных чисел в предыдущее состояние после того, как вы заметили случайную ничью. Вперёд, что вы можете сделать, это сохранить значение .Random.seed
вместе с результатами ваших вычислений. Что-то вроде этого.
x <- .Random.seed
result <- <your code goes here>
attr(result, "seed") <- x
Тогда вы можете reset PRNG следующим образом; result2
должен быть таким же, как result
.
.Random.seed <- attr(result, "seed")
result2 <- <your code goes here>
Ответ 2
Ответ Hong выше выше. Для быстрых и грязных решений, когда я просто повторно выполняю целый script, пока не получаю интересное поведение, я произвольно выбираю целое число, распечатываю его, а затем использую его как семя. Если мой конкретный ход имеет интересное поведение, я отмечаю, что семя:
eff_seed <- sample(1:2^15, 1)
print(sprintf("Seed for session: %s", eff_seed))
set.seed(eff_seed)
Ответ 3
Чтобы добавить к ответу mpettis, если вы не хотите повторно запускать script вручную - генерировать новые случайные семена каждой итерации - Вы могли бы сделать что-то вроде этого:
# generate vector of seeds
eff_seeds <- sample(1:2^15, runs)
# perform 'runs' number of executions of your code
for(i in 1:runs) {
print(sprintf("Seed for this run: %s", eff_seeds[i]))
set.seed(eff_seeds[i])
# your code here
# don't forget to save your outputs somehow
}
Где переменная "работает" представляет собой положительное целое число, указывающее количество раз, когда вы хотите запустить свой код.
Таким образом, вы можете быстро генерировать много результатов и иметь отдельные семена для каждой итерации для воспроизводимости.
Ответ 4
> rnorm(5)
[1] -0.17220331 -0.31506128 -0.35264299 0.07259645 -0.15518961
> Seed<-.Random.seed
> rnorm(5)
[1] -0.64965000 0.04787513 -0.14967549 0.12026774 -0.10934254
> set.seed(1234)
> rnorm(5)
[1] -1.2070657 0.2774292 1.0844412 -2.3456977 0.4291247
> .Random.seed<-Seed
> rnorm(5)
[1] -0.64965000 0.04787513 -0.14967549 0.12026774 -0.10934254
Ответ 5
Я предлагаю следующий подход следующим образом:
для (семя в 1:20) { печать (семена)
}
-
Для того, что вас интересует, вы знаете семя. Итак, если семя переменной содержит целое число, для которого был получен желаемый результат в цикле, перейдите к 3.
-
Запустите это:
set.seed(начальный)
Надеюсь, это поможет!
Приветствия,
Хуан