首页 > 解决方案 > set.seed() 函数与 sample() 函数结合是否始终提供与所用硬件无关的相同样本?

问题描述

我将sample()命令与命令结合运行set.seed()以获得始终相同的样本,并且一切正常。但是,在不同的笔记本电脑上应用相同的命令会返回不同的样本。有谁知道发生了什么?

我也尝试了这种组合set.seed()rnorm()令人惊讶的是,我在两台笔记本电脑上得到了完全相同的随机数。

set.seed(123)
sample(LETTERS,6)

set.seed(123)
rnorm(6,1,1)

我预计在两台笔记本电脑上都会显示结果“H”“T”“J”“U”“W”“A”。但是,一台笔记本电脑显示结果“O”“S”“N”“C”“J”“R”。

set.seed(123)
rnorm(6,1,1)

生产

0.4395244 0.7698225 2.5587083 1.0705084 1.1292877 2.7150650

在两台笔记本电脑上。

标签: rsample

解决方案


这不是由于跨硬件再现性问题,而是在 R 3.6.0 中引入的差异——您必须在 R 3.6.0 上拥有一台机器,而在早期版本上拥有另一台机器。从help("set.seed")(从 R 3.6.0):

用法

...
set.seed(seed, kind = NULL, normal.kind = NULL, sample.kind = NULL)
...

细节

sample.kind 可以是“舍入”或“拒绝”,或与这些匹配。前者是 3.6.0 之前的版本中的默认设置:它使样本在大量人群中明显不均匀,并且只能用于重现旧结果。有关讨论,请参阅 PR#17494。

观察以下内容以查看机器内部的差异(即,这表明它不是跨硬件问题,因为我只在一台机器上执行此操作):

set.seed(123, sample.kind = "Rejection") # Default in R 3.6.0
sample(LETTERS, 6)
# [1] "O" "S" "N" "C" "J" "R"

set.seed(123, sample.kind = "Rounding") # Default in R < 3.6.0
sample(LETTERS, 6)
# [Warning omitted]
# [1] "H" "T" "J" "U" "W" "A"

推荐阅读