【问题标题】:R Help For Martingale Simulation鞅模拟的 R 帮助
【发布时间】:2021-04-09 01:42:25
【问题描述】:

我正在尝试在 R 中进行鞅模拟,我下注一个金额,如果我赢了,我下注相同的金额,但如果我输了,我下注双倍的金额。我一直这样做,直到我没有钱下注或下注 100 次。然后我必须进行 100 次鞅模拟。当我应用我的代码时,我收到以下错误;

错误:“}”中的意外'}'(我认为所有括号都已考虑在内)

martingale_function(m, c, n, p) 中的错误: 找不到函数“martingale_function”

(我不知道为什么会出现这个错误)

m = amount to bet
c = initial bet
n= number of round
p = probability of winning 


martingale_function <- function(m,c,n,p){
  for(i in 1:n){
    betting_money <- m
    amount_bet <- c
    end_Sim <- FALSE
    while(!end_Sim){
      if(runif(1) = p){
        betting_money <- betting_money + amount_bet
        amount_bet <- amount_bet
      }    
      else {
        betting_money <- betting_money - amount_bet
        amount_bet <- amount_bet*2
      }
      if(betting_money <= 0|i=100){# if we have no more money left to bet or have done it 100 times we stop
        end_Sim <- TRUE
  }
}   return(betting_money)  
    }
}
iteration_function <- function(m,c,n,p){
  for(i in 1:100){
    return(data.frame(Iteriation=i,AmountLeft = martingale_function(m,c,n,p)))
  }
}

iteration_function(650,5,100,18/38)

【问题讨论】:

    标签: r statistics


    【解决方案1】:

    错误:

    • 第 13 行:不应该是 runif(1) = p,也许您的意思是 runif(1) &lt; p
    • 第 15 行:我怀疑您的意思是 amount_bet &lt;- c 而不是 amount_bet &lt;- amount_bet
    • 第 21 行:应该是 i==100 而不是 i=100
    • 第 26 行:} 应移到 return() 行之前

    不影响代码执行但应该改变的事情:

    • 第 16 行:写} else { 一行一行是很好的编程习惯
    • 第 24 行:您应该将 return() 移动到自己的行

    另外,我不确定为什么会有两个 for 循环。看来你只需要一个。


    这是我对您的代码的重写(对您正在尝试做的事情做了一些假设):

    # write betting function
    martingale <- function(m, c, p) {
        money   <- m
        betsize <- c
        i <- 1
        while(money > 0 & i <= 100) {
            if(runif(1) < p) {
                money <- money + betsize
                betsize <- c
            } else {
                money <- money - betsize
                betsize <- betsize * 2
            }
            i <- i + 1
        }
        return(money)
    }
    
    # run it 100 times
    n <- 100
    res_df <- data.frame(iteration = rep(NA_integer_, n), amountleft = rep(NA_real_, n))
    for (i in 1:n) {
        res_df[i , "iteration"]  <- i
        res_df[i , "amountleft"] <- martingale(m=650, c=5, p=18/38)
    }
    

    【讨论】:

    • if(runif(1) = p){ 也应该有 2 个=if(runif(1) == p){
    • 我的代码有错误。我最初在一个应该是betsize 的地方写了bet_size。我上面的代码现在是正确的。
    【解决方案2】:

    查看你写的那一行:

    if(runif(1) = p){}
    

    不应该是双等号吗?

    【讨论】:

    • 作为评论可能更好,但绝对有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多