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