裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

ダメ出し:方針が間違えている

2012年08月13日 | ブログラミング

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

 

コメント (1)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ダメ出し:初心者の手本にな... | トップ | ダメ出し:方針が間違えてい... »
最新の画像もっと見る

1 コメント

コメント日が  古い順  |   新しい順
いろんなサイコロをたくさん振る (r-de-r)
2012-09-27 22:14:43
以下のようなプログラムで,あっという間に答えが出る。
引数は,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
返信する

コメントを投稿

ブログラミング」カテゴリの最新記事