如何在不同大小的循环中复制特定的随机抽奖?

时间:2019-02-23 23:25:56

标签: r random

我正努力了解如何复制早期工作的结果。在运行运行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 :(得分:3)

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的繁琐内容。

建议使用顺序种子here;显然,SQL RAND()not reliable when seeded with sequential values,但是我不认为R的生成器有问题...