R 中的随机数生成器,例如 rnorm 在重复运行时给出相同的输出

Posted

技术标签:

【中文标题】R 中的随机数生成器,例如 rnorm 在重复运行时给出相同的输出【英文标题】:Random number generators in R such as rnorm giving identical output on repeated runs 【发布时间】:2017-01-20 06:59:50 【问题描述】:

我有一个加载 RData 文件的脚本。此 RData 文件是由另一个脚本使用 save.image 函数生成的。当我运行加载 RData 文件的脚本时,rnorm 在每次运行时都会给我相同的输出。

这是一个简单的例子。

生成 RData 文件的脚本,

rm(list = ls())
save.image('test.RData')

加载 RData 并调用 rnorm 的脚本,

rm(list = ls())
load('test.RData')
input = rnorm(10)
print(input)

我发现一种方法是在第一个脚本中使用 save 而不是 save.image。然而,这不是很方便,因为我并不总是事先知道我想要保留环境中的哪些对象。但我绝对希望 rnorm 每次运行第二个脚本时使用不同的种子。

【问题讨论】:

【参考方案1】:

可能最简单的方法是重新初始化种子(存储在图像中,因此在加载时会恢复):

set.seed(NULL)

在调用 rnorm 之前。所以你的代码必须改为

rm(list = ls())
load('test.RData')
set.seed(NULL)
input = rnorm(10)
print(input)

编辑:另一种选择是修改生成 RData 文件的脚本,方法是在 save.image() 调用之前立即添加 rm(.Random.seed)。这确保了无论何时加载图像,PRNG(伪随机数生成器)的种子都不会被修改。因此,加载图像的脚本不需要做任何特殊的事情来在每次执行时使用不同的伪随机数序列。这两种解决方案中哪一种更适合您可能取决于您的具体用例。

【讨论】:

重新初始化种子的推荐方式是set.seed(NULL);请参阅文档。 谢谢! - 相应地改变了我的答案。 谢谢!这回答了我的问题。 很好 - 如果您觉得我的回答解决了您的问题,请接受。

以上是关于R 中的随机数生成器,例如 rnorm 在重复运行时给出相同的输出的主要内容,如果未能解决你的问题,请参考以下文章

R语言中dnorm, pnorm, qnorm与rnorm以及随机数

R语言颜色-图例legend及位置调整

R:保存循环的结果

如何在数据帧中沿值的一列生成随机均匀分布而不必对所述列中的每个值重复?

R:随机更改数据框中的值

CRON没有执行R脚本文件