如何在R中模拟鞅过程求解随机发还外套问题的期望结束时间
问题描述
100名观众看完戏剧后前往衣帽间取外套,工作人员完全随机发还外套,拿到本人外套的观众直接离场,拿错的观众归还外套后,工作人员会再次随机发放剩余外套,该流程直到所有观众都拿到正确外套时终止。需要在R中模拟该过程,求解流程的期望结束时间(即迭代总次数)。
原思路存在的问题
你提供的两版思路核心逻辑方向是对的,但第二版代码存在几处可修正的问题:
- 循环条件
X != n逻辑错误,X是初始的1~100向量,无法直接和标量n做比较判断终止条件 - 混淆了赋值符
=和逻辑相等符==,if (X = y)属于语法错误 - 每次仍然全量抽样1~100的编号,没有排除已经离场的观众,不符合实际流程
- 计数逻辑错误,不是仅统计单个拿对外套的观众,而是每一轮所有拿对的观众会同时离场。
正确模拟代码实现
单轮过程模拟函数
simulate_coat_check <- function(n = 100) { # 初始化剩余未拿到自己外套的观众编号 remaining_audience <- seq_len(n) iter_count <- 0 # 所有观众都拿到外套则终止循环 while (length(remaining_audience) > 0) { iter_count <- iter_count + 1 # 仅给剩余观众随机发放对应数量的外套 shuffled_coats <- sample(remaining_audience, size = length(remaining_audience), replace = FALSE) # 筛选出拿错外套、需要参与下一轮发放的观众 remaining_audience <- remaining_audience[remaining_audience != shuffled_coats] } return(iter_count) }
批量模拟求期望
通过多次重复模拟取平均值,得到近似的期望迭代次数:
# 固定随机种子保证结果可复现 set.seed(123) # 重复模拟10000次,模拟次数越多结果越接近理论值 sim_results <- replicate(10000, simulate_coat_check(n = 100)) # 计算期望迭代次数 expected_iterations <- mean(sim_results) print(expected_iterations)
结果说明
该过程的理论期望迭代次数等于观众总数n,100名观众的情况下期望为100次,模拟结果会在100附近小幅波动。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

