我注意到,如果在生成伪随机序列时使用另一个伪随机数生成器,则会干扰种子序列。我的问题是是否有任何方法可以解决这个问题?你能否确保原始的种子序列继续下去?让我举个例子;以下是一个简单的for循环,它打印从正态分布中抽取的伪随机数:
以下是输出结果:
下面,如果迭代器等于五,我们介绍从均匀分布中产生的伪随机数。
以下是输出内容(在下面的输出中,星号表示从均匀分布中伪随机抽取的数):
set.seed(145)
for (i in 1:10){
print(rnorm(1,0,1))
}
以下是输出结果:
以下是输出结果:
[1] 0.6869129
[1] 1.066363
[1] 0.5367006
[1] 1.906029
[1] 1.06316
[1] 1.370344
[1] 0.5277918
[1] 0.4030967
[1] 1.167752
[1] 0.7926794
下面,如果迭代器等于五,我们介绍从均匀分布中产生的伪随机数。
set.seed(145)
for (i in 1:10){
print(rnorm(1,0,1))
if (i == 5){
print(runif(1,0,1))
}
}
以下是输出内容(在下面的输出中,星号表示从均匀分布中伪随机抽取的数):
[1] 0.6869129
[1] 1.066363
[1] 0.5367006
[1] 1.906029
[1] 1.06316
[1] 0.9147102*
[1] -1.508828
[1] -0.03101992
[1] -1.091504
[1] 0.2442405
[1] -0.6103299
我想要找到一个答案,即是否可以继续由set.seed(145)引入的原始种子序列,并因此获得以下输出:
[1] 0.6869129
[1] 1.066363
[1] 0.5367006
[1] 1.906029
[1] 1.06316
[1] 0.9147102*
[1] 1.370344
[1] 0.5277918
[1] 0.4030967
[1] 1.167752
[1] 0.7926794
每一个输入都非常重要,特别是关于这个具体问题的文献参考。
编辑:
根据Rui Barradas的建议,我尝试自己实现一个函数,但没有成功。除了for循环内部的rnorm采样外,for循环内不应该有其他随机性,if语句中的采样应该由Rui的修复处理。但不幸的是,似乎有些东西正在干扰种子序列,因为下面的两个功能返回的不同,并且它们在如何绘制随机性(AR-1方程中通常的epsilon)的方式上有所不同,其他方面相同。
tt <- rnorm(500,0,1)*10
test1 <- function(y, x0=1, n,qsigma = 3, alpha = 5, beta = 20, limit = 0.30){
t <- length(y)
gama <- (alpha + beta)/2
x <- matrix(0,n,t)
x[, 1] <- rep(x0,n)
for(s in 2:t) {
x[, s] <-pmax(alpha*(x[,s-1]<=gama) +beta*(x[,s-1]>gama)+rnorm(n,0,qsigma),1)
if (s==250) {
current <- .GlobalEnv$.Random.seed
resamp <- sample(n, n, replace = TRUE)
x[,s] <- x[resamp,s]
.GlobalEnv$.Random.seed <- current
}
}
list(x = x)
}
test3 <- function(y, x0=1, n,qsigma = 3, alpha = 5, beta = 20, limit = 0.30) {
t <- length(y)
gama <- (alpha + beta)/2
x <- matrix(0,n,t)
x[, 1] <- rep(x0,n)
e_4 <- matrix(rnorm(n * (t), 0, qsigma),n, (t))
for(s in 2:t) {
x[, s] <-pmax(alpha*(x[,s-1]<=gama) +beta*(x[,s-1]>gama)+e_4[,(s-1)],1)
if (s==250) {resamp <-sample(n, n, replace = TRUE)
x[,s] <- x[resamp,s]
}
}
list(x = x, pp = e_4)
}
set.seed(123)
dej11 <- test3(y = tt, n = 5000)$x
set.seed(123)
dej21 <- test1(y = tt, n = 5000)$x
all.equal(dej11,dej21)
我本来期望上述代码最终返回True,而不是告诉我平均相对差为1.186448的信息。