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

时间:2017-01-20 06:59:50

标签: r random save

我有一个加载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 个答案:

答案 0 :(得分:3)

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

set.seed(NULL)

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

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

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