如何在R中的for()循环中使用while()循环

时间:2014-09-07 19:25:23

标签: r for-loop while-loop

我是R的新手,所以我的大部分代码都很可能是错误的。但是,我想知道如何在for()循环中使用while()循环。如果总计2,3,7,11或12然后我停止,我试图模拟几次掷骰子。如果总共4,5,6,8,9或10,那么我继续掷骰子直到初始总数出现或7.我试图找到结束比赛所需的平均掷骰数

count = 0
x = NULL
for (i in 1:10) {
  x[i] = c(sample(1:6,1) +sample(1:6,1))
  if(x[i] == c(2||3||7||11||12)) {
    if(TRUE) {count = count +1}
  } else { while(x[i] == c(4||5||6||8||9||10)) {
    x[i +1] = c(sample(1:6,1)+sample(1:6,1))
    if(x[i+1] == c(x[i]||7)) {
      if(TRUE){count = count + x[i+1]}
    }
  }
  }
}
print(count)

3 个答案:

答案 0 :(得分:3)

我认为您的逻辑存在一些问题。我不太确定你在你的代码中尝试做什么,但这是我对你的问题的描述的解释......这只会运行你的游戏的一轮 - 它如果您将其嵌入for循环中,则应该可以正常工作(只是不要重置count或重置循环中的随机数种子 - 然后count将为您提供总数卷数,你可以除以轮数来得到平均数)

设定:

count = 0
sscore <- c(2,3,7,11,12)
set.seed(101)
debug = TRUE

运行一轮:

x = sample(1:6,1) +sample(1:6,1)  ## initial roll
count = count + 1
if (x %in% sscore) {
    ## don't need to do anything if we hit,
    ## as the roll has already been counted
    if (debug) cat("hit",x[i],"\n")  
} else {
    ## initialize while loop -- try one more time
    y = c(sample(1:6,1)+sample(1:6,1))
    count = count + 1
    if (debug) cat("initial",x,"next",y,"\n")
    while(!(y %in% c(x,7))) {
        y = c(sample(1:6,1)+sample(1:6,1))
        count = count+1
        if (debug) cat("keep trying",y,"\n")

    }  ## end while
}  ## end if-not-hit
print(count)

我尝试将其嵌入for循环中,并且在1000轮内获得3.453的平均值,接近@PawelP的回答。

PS我希望这不是作业,因为我不想回答作业问题......

答案 1 :(得分:2)

编辑:我有一个错误 - 忘记删除if否定。现在,以下内容似乎与您对问题的描述完全一致。

这是我对你所描述的游戏的实现。它计算了在TOTAL_GAMES场比赛中结束比赛所需的平均掷骰数。

TOTAL_GAMES = 1000
counts = rep(0, TOTAL_GAMES)
x = NULL
for (i in 1:TOTAL_GAMES) {
    x_start = c(sample(1:6,1) +sample(1:6,1))
    counts[i] = counts[i] + 1
    x = x_start
    if(x %in% c(2, 3, 7, 11, 12)){
       next
    }

    repeat {
        x = c(sample(1:6,1)+sample(1:6,1))
            counts[i] = counts[i] + 1
        if(x %in% c(x_start, 7)){
            break
        }
    }
}

print(mean(counts))

平均滚动次数似乎在3.38左右

答案 2 :(得分:1)

这是解决这个问题的一种方法 - 我创建了一个运行单个试验的函数,以及另一个执行可变数量的这些试验并返回累积平均值的函数。

## Single trial
rollDice <- function(){
  init <- sample(1:6,1)+sample(1:6,1)
  rolls <- 1
  if( init %in% c(2,3,7,11,12) ){
    return(1)
  } else {
    Flag <- TRUE
    while( Flag ){
      roll <- sample(1:6,1)+sample(1:6,1)
      rolls <- rolls + 1
      if( roll %in% c(init,7) ){
        Flag <- FALSE
      }
      rolls
    }
  }
  return(rolls)
}
## Multiple trials
simAvg <- function(nsim = 100){
  x <- replicate(nsim,rollDice())
  Reduce("+",x)/nsim
}
##
## Testing 
nTrial <- seq(1,1000,25)
Results <- sapply(nTrial, function(X){ simAvg(X) })
##
## Plot over varying number of simulations
plot(x=nTrial,y=Results,pch=20)

正如@Ben Bolker指出的那样,||有一些语法错误,这对于R新手来说是可以理解的。另外,你可能会听到一千次,但是{{{ R}中的1}}和for循环非常低效,因此您通常希望尽可能避免使用它们。对于上述while函数中while循环的情况,它可能不是很重要,因为循环执行次数的概率非常低。我使用函数rollDice()Reduce在第二个函数中担任replicate循环的角色。但问题很好,工作很有趣。

enter image description here