如何用R在目的地打破随机漫步

pnwntuvh  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(135)

我必须为二维空间中的一系列位置生成一个随机行走。进行随机行走的人从(0,0)开始。每次移动时,她都向左、向右、向上或向下移动。如果她回到(0,0),或者直到她走了1000步,随机行走就停止了。* 我使用的是R语言
到目前为止,我已经完成了这一步,但是我很难弄清楚当随机漫步再次到达(0,0)时如何停止随机漫步。我只得到了两个向量。任何帮助都将非常感激。谢谢!

step.max<-1000
destination<-rbind(c(0,0))

Random.walk <- function(n=step.max){
  steps <- matrix(c(0,0,-1,1,0,-1,1,0),nrow = 4)
  walk <- steps[sample(1:5,n,replace = TRUE)] 
  walk.1 <-rbind(walk)
  ifelse(destination,break,apply(walk.1,2,cumsum))
  }
Random.walk(n)
3phpmpom

3phpmpom1#

如果你想在到达原点时停止,你必须使用循环。或者你可以快速生成一个1000步的随机行走,并确定何时到达原点:

steps <- matrix(c(1, 0, -1, 0, 0, 1, 0, -1), nrow = 4, byrow=TRUE)
steps
#      [,1] [,2]
# [1,]    1    0  # Right
# [2,]   -1    0  # Left
# [3,]    0    1  # Up
# [4,]    0   -1  # Down

现在生成一个1000步的随机漫步:

set.seed(42)  # To create a reproducible example
rand <- sample.int(4, 1000, replace=TRUE)
moves <- steps[rand, ]         # 1000 random moves
position <- rbind(c(0, 0), apply(moves, 2, cumsum))  # Position after each move
home <- which(position[, 1] == 0 & position[, 2] == 0)  # When is position c(0, 0)?
home
# [1] 1   # We never revisit the origin in this random walk.

现在说明结果:

plot(position, type="l")
points(0, 0, cex=2, col="red")
points(position[1001, 1], position[1001, 2], cex=2, col="blue")

如果你想在位置返回到c(0,0)时中断行走,你需要一个循环。

steps <- matrix(c(1, 0, -1, 0, 0, 1, 0, -1), nrow = 4, byrow=TRUE)
position <- rbind(c(0, 0))
move <- 0
for (move in 2:1001) {  
    step <- steps[sample.int(4, 1), ]
    position <- rbind(position,  position[move-1, ] + step)
    if (position[move, 1] == 0 & position[move, 2] == 0) break
}
cat("move=", move, "position=", position[move, ], "\n")

变量position将包含步行期间访问的所有位置。
如果您想知道行走在1000步之前返回原点的频率,我们需要为行走创建一个函数,然后使用replicate生成多个行走,例如10,000:

steps <- matrix(c(1, 0, -1, 0, 0, 1, 0, -1), nrow = 4, byrow=TRUE)
walking <- function(n) {
    rand <- sample.int(4, n, replace=TRUE)
    moves <- steps[rand, ]
    position <- rbind(c(0, 0), apply(moves, 2, cumsum))
    home <- which(position[, 1] == 0 & position[, 2] == 0)
    if (is.na(home[2])) 1000 else home[2]
}

results <- replicate(10000, walking(1000))
sum(results < 1000)/10000
# [1] 0.683

因此,大约68%的情况下,遍历在1000步以内结束。您可以增加复制次数。如果您多次运行此过程,百分比将在67 - 68%之间变化。您可以通过增加复制次数来缩小范围,但代码将需要更长的时间来运行。

vfh0ocws

vfh0ocws2#

下面是一个完全矢量化的函数,它将返回随机游走中的位置矩阵,该矩阵将有n + 1行(它包括原点的原始位置),除非游走返回原点。

walk2d <- function(n) {
  n1 <- n + 1L
  m <- matrix(0L, n1, 2)
  m[2:n1 + sample(c(0L, n1), n, 1)] <- sample(c(-1L, 1L), n, 1)
  m[,1] <- cumsum(m[,1])
  m[,2] <- cumsum(m[,2])
  i <- which.min(rowSums(abs(m[-1,])))
  if (i == 1L) m else m[1:(i + 1L),]
}

第14步返回原点的步行:

set.seed(123)
walk2d(20L)
#>       [,1] [,2]
#>  [1,]    0    0
#>  [2,]   -1    0
#>  [3,]   -1   -1
#>  [4,]   -2   -1
#>  [5,]   -1   -1
#>  [6,]   -2   -1
#>  [7,]   -1   -1
#>  [8,]   -1    0
#>  [9,]   -1    1
#> [10,]   -2    1
#> [11,]   -2    0
#> [12,]   -1    0
#> [13,]   -1    1
#> [14,]    0    1
#> [15,]    0    0

在n步内不返回原点的行走

set.seed(94)
walk2d(20L)
#>       [,1] [,2]
#>  [1,]    0    0
#>  [2,]    1    0
#>  [3,]    2    0
#>  [4,]    2    1
#>  [5,]    3    1
#>  [6,]    3    2
#>  [7,]    4    2
#>  [8,]    4    1
#>  [9,]    3    1
#> [10,]    2    1
#> [11,]    3    1
#> [12,]    4    1
#> [13,]    4    0
#> [14,]    4    1
#> [15,]    3    1
#> [16,]    4    1
#> [17,]    5    1
#> [18,]    6    1
#> [19,]    5    1
#> [20,]    4    1
#> [21,]    3    1

相关问题