为何我编写的R语言Martingale模拟函数无法正常输出结果?
R语言Martingale投注策略模拟函数修复
你写的代码运行无输出、逻辑异常是几个明确的语法和逻辑问题导致的,和括号间距无关,R本身不对括号前后空格做强制校验,只要括号是英文半角且配对正确就不会触发语法报错。
现存核心问题
- 变量作用域混乱:
wins、simulations都定义在函数全局环境,函数内部修改全局变量不会按预期生效,多次运行函数结果会互相污染。 - 赋值缺失:输局时只写了
wager*2,没有把计算结果赋值回wager变量,下注额永远不会变化;同时输局时没有扣减对应下注额的本金,赢局时也没有把下注额重置为初始值,收益计算完全错误。 - 模拟样本错误:
possible_nums只生成了5个0-34区间的随机数,不是轮盘赌完整的数字集合,抽样概率完全失真;标准欧式轮盘包含0-36共37个数字,0为绿色位,押奇偶/红黑时0直接算庄家赢。 - 循环逻辑错误:每一轮独立模拟开始时没有重置下注额,第一次模拟如果输到触发下注上限/本金不足,后续几百次模拟的循环判断条件直接不满足,等于只跑了一次模拟;且赢局后没有退出当前轮次的循环,会一直无限下注直到输光,程序会直接卡死看起来像没有输出。
可运行修正代码
Martingale <- function(initial_wager = 5, initial_money = 1000, max_wager = 500, sim_times = 500) { # 初始化函数内部状态变量,避免全局变量干扰 tot_money <- initial_money wins <- 0 # 标准欧式轮盘数字集合,0为庄家通吃位 roulette_nums <- 0:36 for (i in 1:sim_times) { # 每轮模拟开始,重置下注额为初始值 current_wager <- initial_wager # 单轮下注循环:本金足够覆盖当前下注额、且下注额不超过牌桌上限才继续 while (tot_money >= current_wager & current_wager <= max_wager) { roll <- sample(roulette_nums, 1) # 押注偶数,转出非0偶数判定为赢 if (roll != 0 & roll %% 2 == 0) { wins <- wins + 1 # 赢局获得等额下注额收益,计入总本金 tot_money <- tot_money + current_wager # 赢局后下注额重置,结束当前轮次 current_wager <- initial_wager break } else { # 输局扣减对应下注额的本金 tot_money <- tot_money - current_wager # 下注额翻倍,赋值回变量才会生效 current_wager <- current_wager * 2 } } } # 打印结果 print(paste0("总获胜次数:", wins)) print(paste0("最终剩余本金:", tot_money)) # 返回结果方便后续计算 return(list(total_wins = wins, final_balance = tot_money)) } # 运行模拟 Martingale(initial_wager = 5, initial_money = 1000, max_wager = 500, sim_times = 500)
后续调整提示
- 如果要模拟美式轮盘,把数字集合改成包含
00位的38个数字集合即可,注意0和00都算庄家通吃位。 - 如果要统计破产概率、最大回撤等指标,在循环里加对应状态的计数器即可。
内容的提问来源于stack exchange,提问作者cigarettes_after_text
相关产品推荐
相关产品推荐

