![](/img/trans.png)
[英]Unexpected behavior of set.seed() in conjunction with .Random.seed in R?
[英]R: bizarre behavior of set.seed()
当我在set.seed(0)和set.seed(1)时在R中发生奇怪的事情;
set.seed(0)
sample(1:100,size=10,replace=TRUE)
#### [1] 90 27 38 58 91 21 90 95 67 63
set.seed(1)
sample(1:100,size=10,replace=TRUE)
#### [1] 27 38 58 91 21 90 95 67 63 7
当将种子从0更改为1时,我得到完全相同的序列,但移过1个单元格!
请注意,如果我执行set.seed(2),我会得到一个看起来完全不同(随机?)的向量。
set.seed(2)
sample(1:100,size=10,replace=TRUE)
#### [1] 19 71 58 17 95 95 13 84 47 55
谁知道这里发生了什么?
这适用于Mersenne-Twister RNG的R实现。
set.seed()
获取提供的种子并对其进行加密(在C函数RNG_Init中 ):
for(j = 0; j < 50; j++)
seed = (69069 * seed + 1);
然后将这个扰乱的数字( seed
)加扰625次以填写Mersenne-Twister的初始状态:
for(j = 0; j < RNG_Table[kind].n_seed; j++) {
seed = (69069 * seed + 1);
RNG_Table[kind].i_seed[j] = seed;
}
我们可以使用.Random.seed检查RNG的初始状态:
set.seed(0)
x <- .Random.seed
set.seed(1)
y <- .Random.seed
table(x %in% y)
你可以从表中看到有很多重叠。 将此与seed = 3
进行比较:
set.seed(3)
z <- .Random.seed
table(z %in% x)
table(z %in% y)
回到0和1的情况,如果我们检查状态本身(忽略向量的前两个元素不适用于我们正在看的东西),你可以看到状态被一个偏移:
x[3:10]
# 1280795612 -169270483 -442010614 -603558397 -222347416 1489374793 865871222
# 1734802815
y[3:10]
# -169270483 -442010614 -603558397 -222347416 1489374793 865871222 1734802815
# 98005428
由于sample()
选择的值基于这些数字,因此您会得到奇怪的行为。
从另一个答案可以看出,种子0
和1
导致几乎相似的初始状态。 此外,Mersenne Twister PRNG有一个严重的限制 - “ 几乎相似的初始状态需要很长时间才能分化 ”
因此建议使用WELL PRNG等替代品(可以在randtoolbox包中找到)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.