裏 RjpWiki

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

決めうちしないプログラム

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

Rで「ガチャとは心の所作」
Re: Rで「ガチャとは心の所作」について


ご指名があったことに今頃気づいたので,書いて見ました。
元のプログラムにあった iter.max = 10000 は明らかに大きすぎるし,合理的な根拠があってのことではないので,このような値に左右されないようにプログラムしてみるだけで,びっくりするほど(??)効率が上がる。

gacha.sim4 <- function(prob, nop = 10000) {
  n.items <- length(prob)
  nop.result <- numeric(nop)
  for (i in seq(length = nop)) {
    x <- sample(n.items, 100, TRUE, prob) # 100 個で足りなきゃ...
    repeat {
      y <- unique(x)
      if (length(y) == n.items)
        break
      x <- c(x, sample(n.items, 100, TRUE, prob)) # 増やします
    }
    y <- y[n.items]
    nop.result[i] <- which(x == y)[1]
  }
  list(result = nop.result, prob = prob)
}

a_bicky さんの gacha.sim2 とも比較してみた(replications=10 で)。

> library(rbenchmark)

> p <- rep(1, 6)
> benchmark(gacha.sim(p), gacha.sim2(p), gacha.sim4(p), replications = 10)
           test replications elapsed relative user.self sys.self user.child sys.child
1  gacha.sim(p)           10 101.504 22.32329    89.575   12.667          0         0
2 gacha.sim2(p)           10  80.560 17.71718    62.859   18.210          0         0
3 gacha.sim4(p)           10   4.547  1.00000     4.499    0.079          0         0

> p <- c(100, 50, 10, 10, 3, 1)
> benchmark(gacha.sim(p), gacha.sim2(p), gacha.sim4(p), replications = 10)
           test replications elapsed  relative user.self sys.self user.child sys.child
1  gacha.sim(p)           10 663.660 63.127556   639.333   22.399          0         0
2 gacha.sim2(p)           10  75.856  7.215448    57.587   18.606          0         0
3 gacha.sim4(p)           10  10.513  1.000000    10.371    0.210          0         0


コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村