そもそも,この種の問題を解くのに,ブルート・フォースを使うのは良くない。
問題をよく考えれば,理論的な解がちゃんと存在するし,そこまで行かなくても,コンピュータ・パワーを利用すると瞬殺の答えが得られる。
以下のようなプログラムを書くと,n=10 なら 0.028 秒!!,n=398 でも 0.065 秒!!!
n=399 以上は,numeric が扱える上限を超える。gmp ライブラリあたりを使えば良い。
dice.n <- function(n=10) {
d <- c(1:6, 5:1)
for (n in 3:n) {
ld <- length(d)
d2 <- numeric(ld+5)
for (i in 1:6) {
d2[i:(i+ld-1)] <- d2[i:(i+ld-1)]+d
}
d <- d2
}
return(d)
}
> system.time({
+ z <- dice.n(10)
+ barplot(z)
+ })
ユーザ システム 経過
0.028 0.002 0.031
> system.time({
+ z <- dice.n(398)
+ barplot(z)
+ })
ユーザ システム 経過
0.065 0.004 0.068
もう正規分布だね。
※コメント投稿者のブログIDはブログ作成者のみに通知されます