我正在使用 R 用蒙特卡罗过程构建基于代理的模型。这意味着我得到了许多使用某种随机引擎的函数。为了获得可重复的结果,我必须修复种子。但是,据我所知,我必须在每次随机抽取或抽样之前设置种子。这是一个真正的颈部疼痛。有没有办法修复种子?
set.seed(123)
print(sample(1:10,3))
# [1] 3 8 4
print(sample(1:10,3))
# [1] 9 10 1
set.seed(123)
print(sample(1:10,3))
# [1] 3 8 4
最佳答案
有多种选择,具体取决于您的具体需求。我怀疑第一个选项,最简单的还不够,但我的第二个和第三个选项可能更合适,第三个选项最容易自动化。
选项1
如果您事先知道使用/创建随机数的函数将始终绘制相同的数字,并且您不重新排序函数调用或在现有调用之间插入新调用,那么您需要做的就是设置一次种子。实际上,您可能不想继续重置种子,因为您只会继续为每个函数调用获取相同的随机数集。
例如:
> set.seed(1)
> sample(10)
[1] 3 4 5 7 2 8 9 6 10 1
> sample(10)
[1] 3 2 6 10 5 7 8 4 1 9
>
> ## second time round
> set.seed(1)
> sample(10)
[1] 3 4 5 7 2 8 9 6 10 1
> sample(10)
[1] 3 2 6 10 5 7 8 4 1 9
选项 2
如果你真的想确保一个函数使用相同的种子并且你只想设置它一次,请将种子作为参数传递:
foo <- function(...., seed) {
## set the seed
if (!missing(seed))
set.seed(seed)
## do other stuff
....
}
my.seed <- 42
bar <- foo(...., seed = my.seed)
fbar <- foo(...., seed = my.seed)
(其中
....
表示函数的其他参数;这是伪代码)。选项 3
如果您想更加自动化,那么您可以滥用
options
机制,如果您只是在脚本中执行此操作,这很好(对于包,您应该使用自己的选项对象)。然后您的函数可以查找此选项。例如。foo <- function() {
if (!is.null(seed <- getOption("myseed")))
set.seed(seed)
sample(10)
}
然后在使用中我们有:
> getOption("myseed")
NULL
> foo()
[1] 1 2 9 4 8 7 10 6 3 5
> foo()
[1] 6 2 3 5 7 8 1 4 10 9
> options(myseed = 42)
> foo()
[1] 10 9 3 6 4 8 5 1 2 7
> foo()
[1] 10 9 3 6 4 8 5 1 2 7
> foo()
[1] 10 9 3 6 4 8 5 1 2 7
> foo()
[1] 10 9 3 6 4 8 5 1 2 7
关于r - 修复整个 session 的 set.seed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20624698/