我需要生成一个与索引中每个值对应的随机数,无论给出多少索引,都需要为每个索引值重现该值:
作为一个例子,我可能会提供索引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
我想知道是否有更有效的方法来实现上述目标,而不是为每个索引明确设置种子,作为全局种子的偏移量。
答案 0 :(得分:1)
您可以使用digest
软件包来完成以下任务:
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
答案 1 :(得分:0)
使用加密。使用给定键,唯一输入将始终产生唯一输出。只要输入的数字不同,输出就会不同;相同的数字将始终加密到输出的输出密文。使用DES表示64位数字或AES表示128位数字。对于其他尺寸,可以使用自己的Feistel密码(不安全,但随机)或使用Hasty Pudding密码。