我编写了以下代码来模拟Z ^ 2上的无偏随机游动。以1/4的概率,“目标”应该向上,向左,向右或向下移动一个单位。因此,我将“目标”制成一个具有两列的矩阵,一列用于x坐标,一列用于y坐标,然后根据runif(1)
的值递增/递减适当的坐标。
N_trials <- 10
N_steps <- 10
destination <- matrix(0,N_trials,2)
for(n in 1:N_steps) {
p <- runif(1)
if(p < 1/4) {
destination[n,1] <- destination[n,1] - 1
}
else if(p < 1/2) {
destination[n,1] <- destination[n,1] + 1
}
else if(p < 3/4) {
destination[n,2] <- destination[n,2] + 1
}
else if(p < 1) {
destination[n,2] <- destination[n,2] - 1
}
}
但是,该过程似乎从未移出集合{(0,0),(1,0),(-1,0),(0,1),(0,-1)}。为什么是这样?我的代码逻辑上有错误吗?
答案 0 :(得分:3)
这就是我所拥有的---这就是您的想法吗?
set.seed(1)
N_trials <- 10
N_steps <- 10
destination <- matrix(0, N_trials, 2)
for(n in 1:(N_steps-1)) {
p <- runif(1)
if(p < 1/4) {
destination[n+1,1] <- destination[n,1] - 1
destination[n+1,2] <- destination[n,2]
}
else if(p < 1/2) {
destination[n+1,1] <- destination[n,1] + 1
destination[n+1,2] <- destination[n,2]
}
else if(p < 3/4) {
destination[n+1,1] <- destination[n,1]
destination[n+1,2] <- destination[n,2] + 1
}
else if(p < 1) {
destination[n+1,1] <- destination[n,1]
destination[n+1,2] <- destination[n,2] - 1
}
}
destination
[,1] [,2]
[1,] 0 0
[2,] 1 0
[3,] 2 0
[4,] 2 1
[5,] 2 0
[6,] 1 0
[7,] 1 -1
[8,] 1 -2
[9,] 1 -1
[10,] 1 0
答案 1 :(得分:3)
您可以向量化随机游走,而不是使用循环。
想法是首先创建一个可能步骤的矩阵:
steps <- matrix(c(0,0,-1,1,-1,1,0,0),nrow = 4)
这是:
[,1] [,2]
[1,] 0 -1
[2,] 0 1
[3,] -1 0
[4,] 1 0
然后您可以在其中添加随机下标:
steps[sample(1:4,10,replace = TRUE),]
例如,将创建一个9行的矩阵,其中每行都是从steps
矩阵中随机选择的。
如果您以rbind
为起始位置c(0,0)
,然后以每一列的累积总和(cumsum
)为例,那么您便会步步为营。您可以将所有内容包装在一个函数中:
rand.walk <- function(n){
steps <- matrix(c(0,0,-1,1,-1,1,0,0),nrow = 4)
walk <- steps[sample(1:4,n,replace = TRUE),]
walk <-rbind(c(0,0),walk)
apply(walk,2,cumsum)
}
例如,plot(rand.walk(1000),type = 'l')
生成的图形如下所示: