如何实现带偏置硬币15胜制游戏重复运行并存储结果?
带偏置硬币投掷游戏的重复运行实现
问题背景
我做了一个趣味项目,模拟带偏置的硬币投掷游戏:先获得15次正面(我方)或反面(对手)的一方获胜。希望实现该游戏重复运行x次,并存储每次的得分与胜负结果。目前单次运行的R代码可用,但尝试用replicate函数实现重复运行失败,怀疑是得分计数器的状态延续问题。
单次运行代码如下:
MeScore256<-0 OppScore256<-0 turns<-0 Fence <- c("Me", "Opps") #Names while(MeScore256<15 & OppScore256<15){ flip<-sample(c(0,1), size = 1, replace = TRUE, prob = c(0.4,0.6)) if (flip==1){ MeScore256<-MeScore256+1 }else{ OppScore256<-OppScore256+1 } turns<-turns+1 } print(MeScore256) print(OppScore256) if (MeScore256==15){print ("you win round 256") } if (OppScore256==15){print("Opps win 256 :(")}
解决方案
问题出在直接在全局环境中操作计数器,重复运行时计数器状态会被保留,导致每次运行不独立。解决核心是把单次游戏逻辑封装成函数,让每次运行都在函数内部初始化独立变量,再用replicate或lapply重复调用。
步骤1:封装单次游戏为函数
将单次游戏逻辑写成函数,内部初始化所有变量,运行结束后返回关键结果:
play_game <- function() { me_score <- 0 opp_score <- 0 turns <- 0 while(me_score < 15 & opp_score < 15) { # 0代表对手赢,1代表我方赢,概率分别为0.4和0.6 flip <- sample(c(0,1), size = 1, replace = TRUE, prob = c(0.4, 0.6)) if(flip == 1) { me_score <- me_score + 1 } else { opp_score <- opp_score + 1 } turns <- turns + 1 } # 判定胜负 winner <- ifelse(me_score == 15, "Me", "Opps") # 返回结果列表 return(list( me_score = me_score, opp_score = opp_score, winner = winner, total_turns = turns )) }
步骤2:重复运行并存储结果
用replicate重复运行指定次数(比如100次),再将结果整理为数据框方便分析:
# 设置重复运行次数 num_runs <- 100 # 重复运行游戏 game_results <- replicate(num_runs, play_game(), simplify = FALSE) # 转换为数据框 results_df <- do.call(rbind, lapply(game_results, function(x) as.data.frame(x))) # 查看前5次结果 head(results_df)
结果示例
results_df会包含每轮游戏的我方得分、对手得分、胜者和总回合数,示例如下:
me_score opp_score winner total_turns 1 15 12 Me 27 2 15 10 Me 25 3 13 15 Opps 28 4 15 11 Me 26 5 14 15 Opps 29
可选分析
- 统计胜负次数:
table(results_df$winner)
- 查看总回合数分布:
hist(results_df$total_turns, main = "每轮游戏总回合数分布", xlab = "总回合数")
内容的提问来源于stack exchange,提问作者Oscar Scott
相关产品推荐
相关产品推荐

