2014-09-07 7 views
2

저는 R을 처음 사용하기 때문에 대부분의 코드가 잘못되었을 가능성이 큽니다. 그러나 for() 루프 내에서 while() 루프를 사용하는 방법을 궁금 해서요. 총 2,3,7,11, 또는 12 내가 멈 추면 주사위를 여러 번 굴려서 시뮬레이션하려고합니다. 총 4,5,6,8,9 또는 10이면 초기 총계가 나올 때까지 주사위를 굴립니다. 게임을 끝내는 데 걸리는 평균 롤 수를 찾으려고합니다for() 루프 내에서 for() 루프를 사용하는 방법 R

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

주요 문제는'당신이 (대신'|| '연산자'% C가'(2,3,7,11,12)를 X [i]를 %를 사용 * 또는해야한다는 것입니다 * x [i] == 2 || x [i] == 3 || ...') –

+0

당신이 선택한 숫자가 놀랍습니다.첫 번째 그룹의 숫자가 1, 2, 3, 4, 5, 6, 다른 그룹의 7, 8, 9, 10, 11, 12 및 두 번째 그룹의 "탈출" 처음 수 또는 1일까요? 확률은 동일하게 유지됩니다 ... – PawelP

+0

당신은 좋은 비교 세트를 얻고 있습니다 ... –

답변

3

로직에 몇 가지 문제가 있다고 생각합니다. 나는 당신이 당신의 코드에서 무엇을하려고하는지 잘 모르지만, 이것은 당신의 문제에 대한 설명에 대한 나의 해석입니다. 이것은 게임의 한 라운드 만 실행합니다 - 당신이 포함한다면 작동 할 것입니다. 그것은 for 루프에 있습니다 (단지 count을 리셋하지 않거나 루프의 난수 시드를 재설정하지 마십시오 - count은 총 롤 수를 줄 것이고 라운드 수로 나눠 평균을 구할 수 있습니다)

설정 : 단일 라운드 실행

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

:

,536,
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 루프에 끼워 넣으려는 시도가 있었고 @ PawelP의 답변에 가깝게 1000 라운드 동안 평균 3.453을 얻었습니다. 내가 숙제 질문에 대답하지 않으으로이 숙제를하지 희망

PS ...

+0

코드가 괜찮지 만 OP 용으로 정확한 값에 대한 수식이 정확하지 않다는 것을 지적 할 것입니다. 번호를 굴릴 확률은 숫자마다 다릅니다. 또한 "롤 초기 값 또는 7"의 단계는 계산하기가 쉽지 않습니다 (균일하지 않은 확률에 대해 그리고 초기 롤이 될 수 있음을 기억하십시오). 나는 지금 정확한 수식을 제공 할 시간이 없지만 확실히 더 복잡합니다 (곱셈, 덧셈, 나눗셈을 많이합니다 ...) – PawelP

+0

죄송합니다, 감사합니다. –

2

편집 : 나는 버그를했다 - if 부정을 제거하는 것을 잊었다. 이제 아래 내용은 문제에 대한 설명에 100 % 진실 된 것 같습니다.

이것은 내가 설명한 게임의 구현입니다. 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

+0

좋은 솔루션입니다. 비록 'next'와 'repeat'/'break '의 사용이 제 해결책보다 약간의 흐름 (컴팩트 한 경우)에 대해 혼란 스럽다고 생각합니다. –

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) 

@ 벤 Bolker가 지적한 것처럼, 당신은 또한 R. 누군가에 대한 새로운 이해가 ||와 구문 오류의 부부, 당신은 아마 그것을 천 번, 만 forwhile 루프를들을 수 있었다 R에서 꽤 비효율적이므로 일반적으로 가능하면 피하기를 원합니다. 위의 rollDice() 함수에있는 while 루프의 경우, 루프가 많은 횟수로 실행될 확률이 매우 낮기 때문에 큰 문제는 아닙니다. 나는 Reducereplicate 함수를 사용하여 두 번째 함수에서 for 루프의 역할을 수행했습니다. 좋은 질문이지만, 일하는 것이 재미있었습니다.

enter image description here

+1

나는 당신이 게임을 잘못 해석했다고 생각합니다. 약간의 설명. OP는 "초기 합계가 7이 될 때까지"롤백하고, (약간 혼돈 된) 코드는이 해석과 일치하는 것으로 보입니다 (if (x [i + 1] == c (x [i] || 7))''(if [[다음 롤] % in % c ([초기 롤], 7)) '이어야합니다. –

+0

아, 맞아요 - 지적 해 주셔서 고맙습니다. – nrussell