Как я могу воспроизвести определенные случайные ничьи в петлях различного размера? - PullRequest
0 голосов
/ 24 февраля 2019

Я изо всех сил пытаюсь понять, как воспроизвести результаты предыдущей работы.Я установил начальное число перед тем, как запустить цикл с прогонами X, где некоторая случайность происходит в каждой итерации цикла.Сейчас я запускаю меньший цикл с прогонами Y, пытаясь воспроизвести результаты всего за пару итераций этого большего цикла (т. Е. Y

set.seed(23) 
big_loop<-sapply(1:5,function(i) {
  saveRDS(.Random.seed,paste0("run_",i,".RDS"))
  sample(letters,1)
}) 

#I want to replicate the random letter draws on runs 2 and 3 of the big_loop

#I understand why this doesn't work
set.seed(23)
small_loop<-sapply(2:3,function(i) {
  sample(letters,1)
})

#but I'm not sure why this doesn't work.
#how can I make it match runs 2 and 3 of the big loop?
set.seed(23)
small_loop2<-sapply(2:3,function(i) {
  .Random.seed<-readRDS(paste0("run_",i,".RDS"))
  sample(letters,1)
})

#i want this to be false
identical(big_loop[1:2],small_loop) #true
identical(big_loop[1:2],small_loop2) #true

#I want these to be true
identical(big_loop[2:3],small_loop) #false
identical(big_loop[2:3],small_loop2) #false

1 Ответ

0 голосов
/ 24 февраля 2019

R использует .Random.seed из глобальной среды , поэтому вы должны назначить его там: назначение его в функциональной среде не будет работать (как вы видели).

small_loop2<-sapply(2:3,function(i) {
   assign(".Random.seed",readRDS(paste0("run_",i,".RDS")),
         envir=.GlobalEnv)
  sample(letters,1)
})
small_loop2
## [1] "f" "i"
big_loop
## [1] "o" "f" "i" "s" "v"

Другое, немного более удобное решение этой проблемы состоит в том, чтобы последовательно задавать начальное значение в пределах при каждом запуске:

big_loop<-sapply(1:5,function(i) {
  set.seed(22+i)
  sample(letters,1)
}) 
small_loop<-sapply(2:3,function(i) {
  set.seed(22+i)
  sample(letters,1)
})

Таким образом, вы можете воспроизводить результаты, не перемещая громоздкое содержимое.Random.seed вокруг ...

Рекомендуются последовательные семена здесь ;очевидно, что SQL RAND() является ненадежным, если он заполнен последовательными значениями , но я не думаю, что это проблема с генераторами R ...

...