任意长度向量中的可重现随机值

我需要生成一个与索引中每个值相对应的随机数,无论给出多少索引,它都需要对每个索引值都可重现:

作为一个例子,我可能提供索引1到10,然后在不同的时间,调用索引5到10,它们都需要相同的值5到10.设置全局种子将不会这样,它只会对随机调用中第n个项目按向量中的位置保持相同.

到目前为止我所拥有的是这个,它可以按照需要运行:

f = function(ix,min=0,max=1,seed=1){
  sapply(ix,function(x){
    set.seed(seed + x)
    runif(1,min,max)
  })
}
identical(f(1:10)[5:10],f(5:10)) #TRUE
identical(f(1:5),f(5:1)) #FALSE
identical(f(1:5),rev(f(5:1))) #TRUE

我想知道是否有更有效的方法来实现上述目标,而不是为每个索引明确设置种子,作为全局种子的偏移量.

最佳答案 您可以使用摘要包执行以下任务:

library(digest)
f = function(ix, seed=1){
  sapply(ix, digest, algo = "sha256", seed = seed)
}
identical(f(1:10)[5:10],f(5:10)) #TRUE
#> [1] TRUE
identical(f(1:5),f(5:1)) #FALSE
#> [1] FALSE
identical(f(1:5),rev(f(5:1))) #TRUE
#> [1] TRUE
点赞