set.seed 在不同版本的 R(和 Ubuntu)上是不是一致?

Posted

技术标签:

【中文标题】set.seed 在不同版本的 R(和 Ubuntu)上是不是一致?【英文标题】:Is set.seed consistent over different versions of R (and Ubuntu)?set.seed 在不同版本的 R(和 Ubuntu)上是否一致? 【发布时间】:2018-04-22 07:17:04 【问题描述】:

我目前正在运行 R 版本 3.1.0(在 Ubuntu 12.04 LTS 上),并且由于我的 R 版本和我的操作系统都变得相当旧,我计划更新两者。但是,我有很多依赖于 set.seed() 的模拟,我希望它们在更新 R 和我的操作系统后仍然给我相同的随机数。

所以我的问题是三方面的。

    我能否在不更改每个种子生成的数字的情况下更新 R? 我可以为我的操作系统做同样的事情吗? 如果 1) 或 2) 都不是,是否有办法更改我的代码中的种子,使其与旧种子一致?

【问题讨论】:

随机数生成是使用算法完成的。 set.seed() 将种子传递给它。因此,它不应该依赖于操作系统和 R 版本。所以,1. 是的。 2. 是的。 【参考方案1】:

在几个 R 版本(3.1.0、3.3.1、3.4.2)和两台不同的机器(Windows 7 x64、Windows 10 x64)上测试后,我得到了相同的 runif() 随机数和相同的 @987654322 @ 独立于 R 版本和操作系统。据我所知,这表明问题 1 和 2 都是肯定的。

【讨论】:

感谢您的回复。我意识到这可以很容易地进行测试。所以我在两台计算机上运行 set.seed(75842) rnorm(3),使用不同的操作系统和不同版本的 R。在这两种情况下,我得到 [1] 1.5704983 -0.9103801 0.6197490 所以看来从这种观点。【参考方案2】:

跨操作系统一致性:是

如果您在两个不同的操作系统上安装了 R 而没有手动更改默认值或 RProfile,则在使用 set.seed() 时应该会得到相同的结果。

R 版本的一致性:不一定

过去,set.seed() 会在不同的 R 版本中给出相同的结果,但由于 R 3.6.0 中的一个未公布的更新,这通常不再是正确的。因此,您可以获得 R 3.6.0 之前的跨版本一致性比较结果,但是如果您将 3.6.0 后使用的 set.seed() 与 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"

【讨论】:

以上是关于set.seed 在不同版本的 R(和 Ubuntu)上是不是一致?的主要内容,如果未能解决你的问题,请参考以下文章

R在文件上IO后产生不同的结果

R语言set.seed函数的意义及实战

R语言 set.seed()方法

R实战 第十二篇:随机数

在R中设置种子

怎么用R语言生成0-1之间的随机数?