2017-10-15 16 views
0

私は古典的なダイスのシミュレーション問題を抱えています。これは、Rの構文が新しくて実装が苦労しています。以下のように(私はSIMUと呼ばれている)機能が動作します:シミュレーションゲームの機能R

  1. 0ポイント
  2. シミュレートしてスタートn個のランダムな各ドローのための3つの6面体サイコロ
  3. の描画:
    • 合計した場合3つのサイコロ> 12 - > +1ポイント
    • 3つのサイコロの合計< 6の場合 - > -1点
    • そうでない場合(すなわち、合計6〜12):
      • 3つのサイコロは同じ番号がある場合 - > +5点そうでない場合
      • - > 0点 n個のシミュレーションの終了時に得られた点の
  4. 戻る総位

多くの異なる方法を試したところ、私はかなり近くにいるようです。

simu <- function(n){ 
    k <- 0 
    for(i in 1:n) { 
    a <- sample(y,1,replace=TRUE) 
    b <- sample(y,1,replace=TRUE) 
    c <- sample(y,1,replace=TRUE) 
    if ((a + b + c) > 12) { 
     k <- k+1 
    } else if ((a + b + c) < 6) { 
     k <- k-1 
    } else if ((a == b) & (b == c)) { 
     k <- k+5 
    } else k <- 0 
    } 
    return(k) 
} 

問題は、関数内の各 "i"に対して新しいシミュレーション(a、b、c)を繰り返し実行することに失敗しているようです。

+1

それは機能に何か問題があります見ていないあなたは 'SIMU(n)を呼び出すので、もし、あなただけのn'で '、ゼロに'ほとんどの時間をK 'をリセットしている> 1'オッズあなたは 'k < - 0'を得ますか?それ以外の0点は、そうでなければゼロ点を加算するという意味ですか? –

+0

あなたは正しいです - 最後のelse文はk < - k + 0だったはずです。ありがとう。 – Macter

答えて

1

最後にelsekを0に再初期化しました。代わりにk <- k + 0だったはずですが、それを削除するには何も変わりません。

y <- seq(1,6) # 6-sided dice 

simu <- function(n){ 
    k <- 0 
    for(i in 1:n) { 
    a <- sample(y,1,replace=TRUE) 
    b <- sample(y,1,replace=TRUE) 
    c <- sample(y,1,replace=TRUE) 
    if ((a + b + c) > 12) { 
     k <- k+1 
    } else if ((a + b + c) < 6) { 
     k <- k-1 
    } else if ((a == b) & (b == c)) { 
     k <- k+5 
    } #else k <- 0 
    } 
    return(k) 
} 

結果は非常に罰金を見て:

> simu(1000) 
[1] 297 
> simu(100) 
[1] 38 
+1

また、おそらく 'sample(6、1)'が実行しますが、この場合はまったく同じで、はるかに簡単で読みやすくなります。ボーナスとして、余分な変数「y」は必要ありません。 –

0

私は何が必要だと確信していないけど、あなたがそのような何か試すことができます場合は

# Draw the dice(s) - returns vector of length == n_dices 
draw <- function(sides = 6, dices = 3){ 
    sample(1:sides, dices, replace = T) 
} 
# test simulation x and return -1, 0, 1, 1 or 5 
test <- function(x){ 
    (sum(x) > 12)*1 + (sum(x) < 6)*(-1) + (sum(x) >= 6 & 
              sum(x) <= 12 & 
              var(x) == 0)*5 
} 
# simulate n draws of x dices with y sides 
simu <- function(sides = 6, dices = 3, n = 100){ 
    sum(replicate(n, test(draw(sides, dices)))) 
} 
# run simulations of 100 draws for 1, 2, ..., 11, 12-side dices (3 dices each simulation) 
dt <- lapply(1:12, function(side) replicate(100, simu(side, 3, 100))) 
# plot dicstribution of scores 
par(mfrow = c(3,4)) 
lapply(1:length(dt), function(i) hist(dt[[i]], 
             main = sprintf("%i sides dice", i), 
             xlab = "Score" 
            ) 
     ) 

enter image description here

1

をRを使うつもりならば、 'for'ループの代わりにベクトル化された演算を作成することを学ぶべきです。ここでは、計算に1秒未満かかったダイスの100万ロールのシミュレーションがあります。私はどのくらいの間、 'for'ループアプローチが取られているのかはわかりません。

n <- 1000000 # trials 
start <- proc.time() # time how long it takes 
result <- matrix(0L, ncol = 6, nrow = n) 
colnames(result) <- c('d1', 'd2', 'd3', 'sum', 'same', 'total') 

# initial the roll of three dice 
result[, 1:3] <- sample(6L, n * 3L, replace = TRUE) 

# compute row sum 
result[, 'sum'] <- as.integer(rowSums(result[, 1:3])) 

# check for being the same 
result[, 'same'] <- result[,1L] == result[, 2L] & result[, 2L] == result[, 3L] 

result[, 'total'] <- ifelse(result[, 'sum'] > 12L, 
         1L, 
         ifelse(result[, 'sum'] < 6L, 
          -1L, 
          ifelse(result[, 'same'] == 1L, 
            5L, 
            0L 
          ) 
        ) 
) 

table(result[, 'total']) 

    -1  0  1  5 
46384 680762 259083 13771 

cat("simulation took:", proc.time() - start, '\n') 
simulation took: 0.7 0.1 0.8 NA NA