R: set.seed дает тот же результат после удаления семян

Фон. Я хочу сгенерировать случайные последовательности в цикле для в 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()) не работает?

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


person Viacheslav Pyrohov    schedule 01.07.2018    source источник
comment
Вы используете iter в set.seed, что то же самое. Вы ожидаете, что `set.seed (1); sample (1:10) `, чтобы отображать разные значения для каждого прогона   -  person akrun    schedule 02.07.2018
comment
@akrun, да, я ожидаю другого результата после запуска rm (.Random.seed, envir = globalenv ())   -  person Viacheslav Pyrohov    schedule 02.07.2018


Ответы (2)


Похоже, вы стремитесь к случайному поведению с вызовом 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.

person efbbrown    schedule 01.07.2018
comment
он работает нормально, если семя удалено. Спасибо за ответ. Но я не понимаю, почему после удаления .Random.seed новое семя с таким же значением возвращает тот же результат. Причина такого поведения в формуле set.seed? - person Viacheslav Pyrohov; 02.07.2018
comment
В вашем примере вы удаляете семя, а затем устанавливаете его как 1 в своем первом цикле. Задача set.seed - обеспечить воспроизводимость результатов в случайных процессах. set.seed - это генератор псевдослучайных чисел, псевдослучайность означает, что при одной и той же начальной точке (в данном случае 1) всегда будут выбираться одни и те же числа, однако без знания начального числа последовательность чисел, начиная с этой точки и далее, будет казаться наблюдателю случайной. . Это видео set.seed хорошо объясняет: youtube.com/watch?v=zAYzAZwufKI. - person efbbrown; 03.07.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 секунды. Я полагаю, что это всего лишь обходной путь, и главный вопрос все еще открыт.

person Viacheslav Pyrohov    schedule 01.07.2018
comment
Это действительно плохое решение. Используйте предложенное @ efbbrown решение, если вы хотите каждый раз получать случайные результаты. - person user2554330; 02.07.2018