为什么 set.seed() 会影响 R 中的 sample()
Why set.seed() affects sample() in R
我一直认为 set.seed()
只会让随机变量生成器(例如,rnorm
)为任何特定的一组输入值生成一个唯一的序列。
但是,我想知道,为什么当我们设置 set.seed()
时,函数 sample()
不能正确地完成它的工作?
问题
具体来说,给定下面的例子, 有没有办法在 rnorm
之前使用 set.seed
但 sample
仍然会产生来自这个 rnorm
的新随机样本如果 sample
是 运行 多次?
这是一个R代码:
set.seed(123458)
x.y = rnorm(1e2)
sampled = sample(x = x.y, size = 20, replace = TRUE)
plot(sampled)
根据 ?set.seed
处的帮助文件
"If called with seed = NULL it re-initializes (see ‘Note’) as if no
seed had yet been set."
因此,由于 rnorm
和 sample
都受到 set.seed()
的影响,您可以这样做:
set.seed(639245)
rn <- rnorm(1e2)
set.seed(NULL)
sample(rn,5)
我认为保存当前状态并恢复它比使用 NULL
重置种子更有意义。
x <- .Random.seed
set.seed(639245)
rn <- rnorm(1e2)
.Random.seed <- x
sample(rn,5)
我一直认为 set.seed()
只会让随机变量生成器(例如,rnorm
)为任何特定的一组输入值生成一个唯一的序列。
但是,我想知道,为什么当我们设置 set.seed()
时,函数 sample()
不能正确地完成它的工作?
问题
具体来说,给定下面的例子, 有没有办法在 rnorm
之前使用 set.seed
但 sample
仍然会产生来自这个 rnorm
的新随机样本如果 sample
是 运行 多次?
这是一个R代码:
set.seed(123458)
x.y = rnorm(1e2)
sampled = sample(x = x.y, size = 20, replace = TRUE)
plot(sampled)
根据 ?set.seed
"If called with seed = NULL it re-initializes (see ‘Note’) as if no seed had yet been set."
因此,由于 rnorm
和 sample
都受到 set.seed()
的影响,您可以这样做:
set.seed(639245)
rn <- rnorm(1e2)
set.seed(NULL)
sample(rn,5)
我认为保存当前状态并恢复它比使用 NULL
重置种子更有意义。
x <- .Random.seed
set.seed(639245)
rn <- rnorm(1e2)
.Random.seed <- x
sample(rn,5)