我是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)
答案 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
循环的角色。但问题很好,工作很有趣。