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

如何实现带偏置硬币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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 10:02:02