【问题标题】:Reproducible Random Values in Vector of Arbitrary Length任意长度向量中的可重现随机值
【发布时间】:2017-05-10 13:08:34
【问题描述】:

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

例如,我可能会提供 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

我想知道是否有更有效的方法来实现上述目标,无需为每个索引显式设置种子,作为全局种子的偏移量。

【问题讨论】:

    标签: r random seed


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      使用加密。使用给定的密钥,唯一的输入将始终产生唯一的输出。只要您输入的数字不同,那么输出将始终不同;相同的数字将始终加密到输出的密文。对 64 位数字使用 DES,对 128 位数字使用 AES。对于其他大小,请使用您自己的 Feistel 密码(不安全,但随机)或使用 Hasty Pudding 密码。

      【讨论】:

      • 你能举个例子吗?
      • 举个例子?一般加密? DES? AES?一般Feistel cipherHasty Pudding cipher?
      • 一个如何使用它来解决我的实际问题的示例。
      • 我不知道 r,所以我不能给你一个可行的例子。每当您想从索引生成一个随机出现的数字(当然它不是真正随机的)时,请使用 r 等效于 pseudoRandomNumber = encrypt(key, index) 始终保持密钥相同,并且为每个索引生成的数字将是唯一的并且相同的索引将始终生成相同的数字。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 2012-11-01
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      相关资源
      最近更新 更多