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

为何我编写的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:30:54