如何修正R语言中计算季后赛系列赛剩余预期胜场的函数?
修正R语言季后赛预期胜场计算函数(7场4胜制)
原函数的核心问题是未考虑季后赛系列赛的提前结束机制:当某支球队先赢够指定场次(如4场)时,系列赛立即终止,后续比赛不会进行。直接使用二项分布会包含这些不可能发生的比赛序列,导致预期胜场计算错误。
比如题目中0-3落后的场景:球队单场胜率50%,对手已赢3场(系列赛需赢4场),原函数会错误计入类似LWWW这种不可能的序列(对手赢3场后系列赛已结束),而实际预期胜场应为0.9375。
修正后的函数实现
get_expected_wins <- function(wp_a, win_needed, opponent_wins = 0, team_wins = 0) { # 计算双方剩余需要赢的场次 remaining_team <- win_needed - team_wins remaining_opponent <- win_needed - opponent_wins # 若系列赛已分胜负,直接返回当前胜场数 if (remaining_team <= 0) return(win_needed) if (remaining_opponent <= 0) return(team_wins) expected_wins <- 0 # 计算球队未能赢下系列赛的所有情况:对手先赢够场次 for (t in 0:(remaining_team - 1)) { # 前(t + remaining_opponent - 1)场,球队赢t场、对手赢(remaining_opponent - 1)场 # 最后一场由对手赢下,系列赛终止 prob <- choose(t + remaining_opponent - 1, t) * (wp_a^t) * ((1 - wp_a)^remaining_opponent) expected_wins <- expected_wins + prob * (team_wins + t) } # 计算球队赢下系列赛的所有情况:球队先赢够场次 for (m in 0:(remaining_opponent - 1)) { # 前(remaining_team + m - 1)场,球队赢(remaining_team - 1)场、对手赢m场 # 最后一场由球队赢下,系列赛终止 prob <- choose(remaining_team + m - 1, m) * (wp_a^remaining_team) * ((1 - wp_a)^m) expected_wins <- expected_wins + prob * win_needed } return(expected_wins) }
验证示例
调用题目中的测试场景:
get_expected_wins(wp_a = 0.5, win_needed = 4, opponent_wins = 3, team_wins = 0)
返回结果为0.9375,与实际预期一致。
函数逻辑说明
- 前置判断:先检查系列赛是否已结束(某队已赢够场次),直接返回对应胜场数。
- 非获胜场景计算:遍历球队可能赢的场次(从0到差1场夺冠),计算对手先夺冠的概率,乘以对应胜场数累加。
- 获胜场景计算:遍历对手可能赢的场次(从0到差1场夺冠),计算球队先夺冠的概率,以最终夺冠胜场数(win_needed)乘以概率累加。
- 求和得到预期胜场:将两种场景的贡献相加,得到最终预期值。
内容的提问来源于stack exchange,提问作者Canovice
相关产品推荐
相关产品推荐

