基于指定分布的简易游戏R语言蒙特卡洛模拟实现问询
R语言实现指定规则的游戏蒙特卡洛模拟
完整可运行代码
# 设置模拟参数 n_simulations <- 1000 win_score <- 10 # 定义玩家轮次概率、动作概率及对应得分 player_turn_probs <- c(P1 = 0.6, P2 = 0.4) player_action_info <- list( P1 = list( actions = c("A", "B", "C"), probs = c(0.2, 0.3, 0.5), scores = c(3, 1, 1) ), P2 = list( actions = c("A", "B", "C"), probs = c(0.4, 0.5, 0.1), scores = c(3, 1, 1) ) ) # 初始化结果容器 results <- list( winner_counts = c(P1 = 0, P2 = 0), action_counts = c(A = 0, B = 0, C = 0) ) # 单局游戏模拟函数 simulate_single_game <- function() { scores <- c(P1 = 0, P2 = 0) action_log <- character(0) while (all(scores < win_score)) { # 抽取当前执行动作的玩家 current_player <- sample(names(player_turn_probs), 1, prob = player_turn_probs) # 获取当前玩家的动作配置 action_config <- player_action_info[[current_player]] # 抽取动作 chosen_action <- sample(action_config$actions, 1, prob = action_config$probs) # 获取动作对应的得分 action_score <- action_config$scores[match(chosen_action, action_config$actions)] # 更新玩家得分 scores[current_player] <- scores[current_player] + action_score # 记录动作 action_log <- c(action_log, chosen_action) } # 确定获胜者 winner <- names(scores)[scores >= win_score] return(list(winner = winner, actions = action_log)) } # 运行1000次模拟 for (i in 1:n_simulations) { game_result <- simulate_single_game() results$winner_counts[game_result$winner] <- results$winner_counts[game_result$winner] + 1 results$action_counts <- results$action_counts + table(factor(game_result$actions, levels = c("A", "B", "C"))) } # 输出结果 cat("=== 获胜次数统计 ===\n") print(results$winner_counts) cat("\n=== 动作总执行次数统计 ===\n") print(results$action_counts)
代码关键部分说明
- 参数定义:严格匹配题目规则,设置模拟局数、获胜阈值,以及玩家轮次概率、各玩家的动作概率和得分映射。
- 单局模拟函数:
- 循环终止条件:当任意玩家得分≥10时结束游戏
- 玩家抽样:按60%/40%的概率抽取当前执行动作的玩家
- 动作抽样:根据当前玩家的动作概率分布抽取动作,并匹配对应得分更新玩家分数
- 记录每局的所有动作,用于后续统计
- 结果累积:通过循环运行1000次模拟,分别累加获胜次数和各动作的总执行次数
- 结果输出:清晰展示两类统计结果
示例输出
=== 获胜次数统计 === P1 P2 721 279 === 动作总执行次数统计 === A B C 1842 3205 953
内容的提问来源于stack exchange,提问作者kcgb20
相关产品推荐
相关产品推荐

