R: set.seed дает тот же результат после удаления семян - PullRequest
0 голосов
/ 02 июля 2018

Фон. Я хочу создать случайные последовательности в пределах для цикла в R v.3.5.0. Для этого я использую код как показано ниже:

rm(.Random.seed, envir=globalenv())
some_list = list()
for (iter in 1:3) {
  set.seed(iter)
  some_list[[iter]] = sample(1:10)
}
some_list

Этот код возвращает мне список вроде этого:

> some_list
[[1]]
 [1]  3  4  5  7  2  8  9  6 10  1
[[2]]
 [1]  2  7  5 10  6  8  1  3  4  9
[[3]]
 [1]  2  8  4  3  9  6  1  5 10  7

После этого я повторно запускаю тот же сценарий и ожидаю сброса начального числа после выполнения rm(.Random.seed, envir=globalenv()) в течение сеанса, следовательно, получаю другой результат.

Но реальность другая - я получаю точно такой же список даже после удаления .Random.seed из globalenv(). Пожалуйста, смотрите экран с точной последовательностью команд: Последовательность команд

Меня действительно смущает такое поведение set.seed.

Мой вопрос:

1) Нормально ли такое поведение set.seed?

2) Как сбросить семя, если rm(.Random.seed, envir=globalenv()) не работает?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Похоже, вы стремитесь к случайному поведению при вызове rm(.Random.seed, envir=globalenv()), так почему бы просто не удалить set.seed из вашего кода вообще?

rm(.Random.seed, envir=globalenv())
some_list = list()
for (iter in 1:3) {
  some_list[[iter]] = sample(1:10)
}
some_list

Выше каждый раз выдает разные результаты. Нет необходимости иметь set.seed в нашем коде.

0 голосов
/ 02 июля 2018

Я создал обходной путь, основанный на использовании Sys.time () в качестве начального числа. Вот код:

some_list = list()
for (iter in 1:3) {
  set.seed(as.numeric(Sys.time()))
  some_list[[iter]] = sample(1:10)
  Sys.sleep(1)
}
some_list

Но, тем не менее, мне нужно было добавить Sys.sleep(1), потому что это решение не работает, если операция в цикле длится менее 1 секунды. Я считаю, что это всего лишь обходной путь, и главный вопрос все еще остается открытым.

...