【问题标题】:Using parSapply to generate random numbers使用 parSapply 生成随机数
【发布时间】:2015-06-18 15:44:18
【问题描述】:

我正在尝试运行一个函数,该函数中有一个随机数生成器。结果与我预期的不一样,所以我做了以下测试:

# Case 1
set.seed(100)
A1 = matrix(NA,20,10)
for (i in 1:10) {
  A1[,i] = sample(1:100,20)
}

# Case 2
set.seed(100)
A2 = sapply(seq_len(10),function(x) sample(1:100,20))

# Case 3
require(parallel)
set.seed(100)
cl <- makeCluster(detectCores() - 1)
A3 = parSapply(cl,seq_len(10), function(x) sample(1:100,20))
stopCluster(cl)

# Check: Case 1 result equals Case 2 result
identical(A1,A2)
# [1] TRUE

# Check: Case 1 result does NOT equal to Case 3 result
identical(A1,A3)
# [1] FALSE

# Check2: Would like to check if it's a matter of ordering
range(rowSums(A1))
# [1] 319 704

range(rowSums(A3))
# [1] 288 612

在上面的代码中,parSapply 生成一组与 A1 和 A2 不同的随机数。我拥有 Check2 的目的是,我怀疑 parSapply 可能会改变顺序,但似乎并非如此,因为这些随机数的最大和最小总和不同。

如果有人能解释一下为什么 parSapply 会给出与 sapply 不同的结果,请不胜感激。我在这里错过了什么?

提前致谢!

【问题讨论】:

    标签: r random parallel-processing


    【解决方案1】:

    查看?vignette(parallel),尤其是“第 6 节随机数生成”。除其他事项外,它指出以下内容

    使用(伪)随机数进行并行计算时需要注意:运行独立计算部分的进程/线程需要运行独立的(最好是可重现的)随机数流。

    当 R 进程启动时,它会在已保存的工作空间中从对象 .Random.seed 中获取随机数种子,或者在首次使用随机数生成时从时钟时间和进程 ID 构造一个(请参阅帮助在 RNG 上)。因此工作进程可能会得到相同的种子 因为包含 .Random.seed 的工作空间已恢复或在分叉之前已使用随机数生成器:否则这些将获得不可重现的种子(但很有可能每个工人都有不同的种子)。

    您还应该看看?clusterSetRNGStream

    【讨论】:

      猜你喜欢
      • 2015-03-14
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 2021-05-24
      • 2014-09-21
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多