使用parSapply生成随机数

时间:2015-04-13 10:49:28

标签: r random parallel-processing

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

# 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会给出不同的结果。我在这里缺少什么?

提前致谢!

1 个答案:

答案 0 :(得分:5)

查看?vignette(parallel),特别是&#34;第6节随机数生成&#34;。除其他外,它陈述以下

  

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

     

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

您还应该查看?clusterSetRNGStream