r - 修复整个 session 的 set.seed

标签 r montecarlo random-sample agent-based-modeling

我正在使用 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/

相关文章:

r - 如何使用 R 根据向量中的部分列名从数据框中提取所有列

machine-learning - MCTS 如何与 'precise lines' 配合使用

按组替换重新采样

随机抽样 - 矩阵

r - R中runif和sample的区别?

r - 更改 googleVis R 包中 gvisMap 上的点颜色

r - 在 R 中分析 SVM (e1071)

使用 Snow/doSNOW 为内循环重置 R 随机数生成器 (rlecuyer)

algorithm - 随机算法的属性(蒙特卡罗,拉斯维加斯)

c++ - 将对象传递给 C/C++ 时如何禁止 R 垃圾回收?