set.seed 在不同版本的 R(和 Ubuntu)上是否一致?
Is set.seed consistent over different versions of R (and Ubuntu)?
我目前是 运行 R 版本 3.1.0(在 Ubuntu 12.04 LTS 上)并且由于我的 R 版本和操作系统都变得相当老旧,我计划同时更新两者。但是,我有很多依赖于 set.seed() 的模拟,我希望它们在更新 R 和我的操作系统后仍然给我相同的随机数。
所以我的问题有三层。
- 我可以在不更改每个种子生成的数字的情况下更新 R 吗?
- 我可以为我的操作系统做同样的事情吗?
- 如果 1) 或 2) 都不是,是否有办法更改我的代码中的种子,使其与旧种子一致?
在几个 R 版本(3.1.0、3.3.1、3.4.2)和两台不同的机器(Windows 7 x64,Windows 10 x64)上进行了测试,我得到了相同的结果runif()
个具有相同 set.seed()
的随机数,与 R 版本和操作系统无关。据我所知,这表明问题 1 和问题 2 都是肯定的。
Cross-OS一致性:是
如果您在两个不同的操作系统上安装了 R 而没有手动更改默认值或 RProfile
,您应该在使用 set.seed()
时得到相同的结果。
R 版本的一致性:不一定
过去 set.seed()
会在 R 版本中给出相同的结果,但由于 R 3.6.0 中的 little-announced 更新,这种情况不再普遍存在。因此,您可以获得 R 3.6.0 之前的跨版本一致性比较结果,但是如果您将 post-3.6.0 使用 set.seed()
与 pre-3.6.0 使用 set.seed()
进行比较,你会得到不同的结果。
您可以在下面的示例中看到:
R 3.2.0
> set.seed(1999)
> sample(LETTERS, 3)
[1] "T" "N" "L"
R 3.5.3
> set.seed(1999)
> sample(LETTERS, 3)
[1] "T" "N" "L"
R 3.6.0
set.seed(1999)
sample(LETTERS, 3)
[1] "D" "Z" "R"
不一致的原因是在R 3.6.0中,the default kind of under-the-hood random-number generator was changed。现在,为了让 set.seed()
的结果匹配,您必须首先调用函数 RNGkind(sample.kind = "Rounding")
.
R 3.6.0
> RNGkind(sample.kind = "Rounding")
Warning message:
In RNGkind(sample.kind = "Rounding") : non-uniform 'Rounding' sampler used
> set.seed(1999)
> sample(Letters, 3)
[1] "T" "N" "L"
我目前是 运行 R 版本 3.1.0(在 Ubuntu 12.04 LTS 上)并且由于我的 R 版本和操作系统都变得相当老旧,我计划同时更新两者。但是,我有很多依赖于 set.seed() 的模拟,我希望它们在更新 R 和我的操作系统后仍然给我相同的随机数。
所以我的问题有三层。
- 我可以在不更改每个种子生成的数字的情况下更新 R 吗?
- 我可以为我的操作系统做同样的事情吗?
- 如果 1) 或 2) 都不是,是否有办法更改我的代码中的种子,使其与旧种子一致?
在几个 R 版本(3.1.0、3.3.1、3.4.2)和两台不同的机器(Windows 7 x64,Windows 10 x64)上进行了测试,我得到了相同的结果runif()
个具有相同 set.seed()
的随机数,与 R 版本和操作系统无关。据我所知,这表明问题 1 和问题 2 都是肯定的。
Cross-OS一致性:是
如果您在两个不同的操作系统上安装了 R 而没有手动更改默认值或 RProfile
,您应该在使用 set.seed()
时得到相同的结果。
R 版本的一致性:不一定
过去 set.seed()
会在 R 版本中给出相同的结果,但由于 R 3.6.0 中的 little-announced 更新,这种情况不再普遍存在。因此,您可以获得 R 3.6.0 之前的跨版本一致性比较结果,但是如果您将 post-3.6.0 使用 set.seed()
与 pre-3.6.0 使用 set.seed()
进行比较,你会得到不同的结果。
您可以在下面的示例中看到:
R 3.2.0
> set.seed(1999)
> sample(LETTERS, 3)
[1] "T" "N" "L"
R 3.5.3
> set.seed(1999)
> sample(LETTERS, 3)
[1] "T" "N" "L"
R 3.6.0
set.seed(1999)
sample(LETTERS, 3)
[1] "D" "Z" "R"
不一致的原因是在R 3.6.0中,the default kind of under-the-hood random-number generator was changed。现在,为了让 set.seed()
的结果匹配,您必须首先调用函数 RNGkind(sample.kind = "Rounding")
.
R 3.6.0
> RNGkind(sample.kind = "Rounding")
Warning message:
In RNGkind(sample.kind = "Rounding") : non-uniform 'Rounding' sampler used
> set.seed(1999)
> sample(Letters, 3)
[1] "T" "N" "L"