You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言随机游走首次到达指定点时间模拟异常问题求助

修正随机游走首次到达时间模拟的逻辑错误

你的模拟逻辑存在核心问题:代码只统计了在n_steps步内实际到达过的位置的首次相遇时间,完全忽略了那些在模拟步数内从未到达的位置。对于距离起点越远的位置,大部分模拟都无法在n_steps步内到达,最终纳入统计的只是少数“偶然快速到达”的样本,这就导致远位置的平均/中位数时间反而偏低,出现不符合对称性的“低谷”。

错误点拆解

  • 原simulate_walk函数仅返回当前游走路径中出现过的位置,未到达的位置没有数据记录
  • 统计时仅对存在数据的位置计算均值,相当于只筛选了“成功到达”的样本,造成严重的选择偏差

方案1:针对单个目标位置模拟(推荐,匹配“首次到达指定点”的需求)

如果你的目标是计算到达某一指定点的平均时间,应该针对每个目标位置单独模拟,直到到达该位置(或设定最大步数避免极端情况无限循环):

set.seed(123)

n_iterations <- 100000
max_steps <- 10000  # 设定最大步数,防止极端情况无限循环

# 模拟到达指定位置的首次步数
simulate_first_arrival <- function(target_pos) {
  current_pos <- 0
  steps <- 0
  while (current_pos != target_pos && steps < max_steps) {
    current_pos <- current_pos + sample(c(-1, 1), 1)
    steps <- steps + 1
  }
  # 若达到最大步数仍未到达,返回NA(可根据需求调整处理方式)
  return(ifelse(steps < max_steps, steps, NA))
}

# 示例:计算到达位置+5和-5的首次到达时间分布
target_positions <- c(-5, 5)
arrival_times <- lapply(target_positions, function(pos) {
  replicate(n_iterations, simulate_first_arrival(pos))
})

# 整理结果并可视化
result_df <- data.frame(
  position = rep(target_positions, each = n_iterations),
  steps = unlist(arrival_times)
)

# 过滤未到达的样本(或保留NA做更全面统计)
result_df <- result_df[!is.na(result_df$steps), ]

summary_data <- result_df %>%
  group_by(position) %>%
  summarize(
    mean_encounter = mean(steps),
    median_encounter = median(steps),
    q25 = quantile(steps, 0.25),
    q75 = quantile(steps, 0.75)
  )

ggplot(summary_data, aes(x = position, y = median_encounter)) +
  geom_line() +
  geom_ribbon(aes(ymin = q25, ymax = q75), alpha = 0.2) +
  geom_point() +
  labs(title = "首次到达指定位置的步数分布",
       x = "目标位置",
       y = "首次到达步数") +
  theme_minimal() +
  scale_y_continuous(limits = c(0, NA))

方案2:修正原批量模拟的统计逻辑

如果要保留批量模拟所有位置的逻辑,需要对每个位置记录所有模拟中是否到达,以及到达的首次时间,未到达的用NA标记,统计时可选择计算条件均值(仅针对到达的样本)或包含未到达的情况:

set.seed(123)

n_iterations <- 100000
n_steps <- 100

simulate_walk <- function() {
  walk <- cumsum(c(0, sample(c(-1, 1), n_steps, replace = TRUE)))  # 包含起点0
  # 生成当前路径覆盖的所有位置范围
  all_pos <- min(walk):max(walk)
  # 对每个位置计算首次到达时间,未到达则标记为NA
  first_encounters <- sapply(all_pos, function(pos) {
    idx <- which(walk == pos)
    if (length(idx) > 0) min(idx) else NA
  })
  return(data.frame(position = all_pos, first_encounter = first_encounters))
}

all_encounters <- replicate(n_iterations, simulate_walk(), simplify = FALSE)
result <- do.call(rbind, all_encounters)

# 统计时:同时计算到达概率和条件均值(仅针对到达样本)
summary_data <- result %>%
  group_by(position) %>%
  summarize(
    arrival_prob = mean(!is.na(first_encounter)),  # 该位置的到达概率
    mean_encounter = mean(first_encounter, na.rm = TRUE),
    median_encounter = median(first_encounter, na.rm = TRUE),
    q25 = quantile(first_encounter, 0.25, na.rm = TRUE),
    q75 = quantile(first_encounter, 0.75, na.rm = TRUE)
  )

ggplot(summary_data, aes(x = position, y = median_encounter)) +
  geom_line() +
  geom_ribbon(aes(ymin = q25, ymax = q75), alpha = 0.2) +
  geom_point() +
  labs(title = "各位置首次到达步数分布(仅统计到达样本)",
       x = "位置",
       y = "首次到达步数") +
  theme_minimal() +
  scale_y_continuous(limits = c(0, NA))

内容的提问来源于stack exchange,提问作者heartofdarkness

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:13:20