使用dorng包的可重复随机数

使用dorng包的可重复随机数,r,random,random-seed,R,Random,Random Seed,我试图使用foreach和dorng包在R中生成一组可重复的随机数。我的期望是,在下面两种情况下,我应该得到相同的随机数。然而,这不是我所看到的 下面是我试图做的简要概述 播种 在循环中,随机睡眠一段时间,得到20个随机数的列表 保存第一个随机数列表 使用不同的随机睡眠持续时间,再次重复步骤1和2中的过程 保存第二个随机数列表 比较第一个和第二个随机数列表 我希望第一组随机数和第二组随机数是相同的。顺序可能会有所不同,因为每个并行进程可能会在随机时间内休眠,并且可能会影响随机数的总体顺序。然而,

我试图使用
foreach
dorng
包在R中生成一组可重复的随机数。我的期望是,在下面两种情况下,我应该得到相同的随机数。然而,这不是我所看到的

下面是我试图做的简要概述

  • 播种
  • 在循环中,随机睡眠一段时间,得到20个随机数的列表
  • 保存第一个随机数列表
  • 使用不同的随机睡眠持续时间,再次重复步骤1和2中的过程
  • 保存第二个随机数列表
  • 比较第一个和第二个随机数列表
  • 我希望第一组随机数和第二组随机数是相同的。顺序可能会有所不同,因为每个并行进程可能会在随机时间内休眠,并且可能会影响随机数的总体顺序。然而,在下面的例子中,我看到200个数字中只有122个匹配。如果我把随机睡眠时间从8秒和10秒改为8秒和12秒,常见的随机数会下降更多。我使用睡眠作为foreach循环中发生的计算和其他处理的代理

    非常感谢您对可能出现问题的任何帮助

    library(doParallel)
    library(doRNG)
    library(foreach)
    
    # Make 10 clusters and set them to run in parallel
    cl <- makeCluster(10)
    registerDoParallel(cl)
    
    ## COLLECT THE FIRST SET OF RANDOM NUMBERS 
    set.seed(123)
    # Sleep duration for first sample collection
    x <- 0:10
    
    # Generate 10 random numbers after a random amount of sleep
    rp1 <- foreach(i=1:20, .combine = 'c', .options.RNG=123) %dorng%{ 
      # Sleep for random duration
      Sys.sleep(sample(x))
      return(rnorm(10,0,1))
    }
    
    ## RESET THE SEED AND COLLECT SECOND SET OF RANDOM NUMBERS
    set.seed(123)
    # Sleep duration for second sample collection
    x <- 0:8
    
    # Generate 10 random numbers after a random amount of sleep
    rp2 <- foreach(i=1:20, .combine = 'c', .options.RNG=123) %dorng%{ 
      # Sleep for random duration
      Sys.sleep(sample(x))
      return(rnorm(10,0,1))
    }
    
    stopCluster(cl)
    
    # Do a diff between the two sets of random numbers
    common <- intersect(rp1,rp2)
    print(length(common))
    
    库(双并行)
    图书馆(道恩)
    图书馆(foreach)
    #制作10个集群,并将它们设置为并行运行
    
    这能回答你的问题吗@彼得,似乎是想逃避你所做的linked@Waldi-没错。我这里的示例代码是利用dorng包并遵循文档中的示例..我发布了一个示例代码,因为我得到的结果与您的完全相同,但不理解为什么。我发现了上面代码的问题。sample函数的使用方法不正确,这导致foreach的每次迭代都会绘制不同数量的随机样本,使得rnorm返回的数据在两个测试用例之间有所不同。从foreach循环中删除
    示例
    可以解决此问题。