「dice」にて,
> サイコロ3個ふって出目をカウント
> 6進法を使ってみた。
最後に
> サイコロ10個振ると?
とあるが,質問しているのか,挑戦しているのか,
少なくとも,掲載されているプログラムでは時間が掛かってやる気が起きない。
n <- 8
dice <- function(dec = 2, size = 2) (sum(mapply(as.integer, strsplit(dec2base(dec,
6, size), "")) + 1))
a <- rep(0, 6*n)
names(a) <- 1:(6*n)
for (i in 0:(6^n-1)) {
b <- dice(i, size = n)
a[b] <- a[b] + 1
}
print(a[n:(6*n)])
8個のサイコロを振ったら,126秒ほどかかる。10個振ると4500秒くらいもかかると思う。
=======
別のアプローチとして,expand.grid というのを使う。
x expand.grid(x, x, x) としてできるものは,各行は3つのサイコロの出目である。行数は 6^3 行である。
10個のサイコロを振るなら,expand.grid(x,x,x,x,x,x,x,x,x,x) とすれば,6^10行,10列の行列ができる。rowSums で出目の和をとり,table 関数で集計し,barplot で図を描く。
実行時間は 50 秒ほど。
> system.time({
+ n <- 10
+ x <- 1:6
+ y <- eval(parse(text=paste("expand.grid(", paste(rep("x", n), collapse=","), ")", collapse="")))
+ barplot(table(rowSums(y)), las=1)
+ })
ユーザ システム 経過
50.398 7.074 57.070
引数は,m はサイコロの目の最大値(普通のサイコロなら6,正20面体のサイコロなら20),n は同時に振るサイコロの数。
http://rpubs.com/r-de-r/1814 を参照のこと
> dice <- function(m, n) {
+ me0 <- 1
+ for (i in 1:n) {
+ me <- numeric(m * i)
+ l <- length(me0) - 1
+ me[i:(i + l)] <- me0
+ for (j in 1:(m - 1)) {
+ me[(i + j):(i + j + l)] <- me[(i + j):(i + j + l)] + me0
+ }
+ me0 <- me[me != 0]
+ }
+ return(list(freq = me0, min = n, max = m * n))
+ }
>
> system.time(a<-dice(6, 10))
ユーザ システム 経過
0.010 0.001 0.011