もう数式ガリガリいじって解く力がなくなっている

MikuHatsune2012-08-01

こんな問題があったのでRを使って解く。
 
1円支払うと1回引けるクジがあり、1/6の確率で当たると7円貰えるが外れると何も貰えない。このクジを複数回連続で引く時、最終的な収支が±0円以上である確率が95%を超えるのは、クジを何回引く時か。
 
クジをn=1,\hspace{3}2,\hspace{3}3,\hspace{3}...\hspace{3},\hspace{3}N回引くとき、それぞれについてシミュレーションを十分回行なって、確率が十分に収束しているという感じで、並列化も交えてやってみる。

#一回シミュレーションを行うと、引く回数が1~N回の時の収支>=0かどうかを返す関数。
#収支>=0なら1,<0なら0が返ってくる。
#snowによる並列計算は、引き渡す関数内にすべての変数を収めておくのがいいっぽい。
fn <- function(){
	N <- 300
	res <- numeric(N)
	for(trial in 1:N){
		a1 <- sample(c(7, -1), size=trial, prob=c(1/6, 5/6), replace=TRUE)
		res[trial] <- sum(a1) >= 0
	}
	return(res)
}
library(snow)
cl <- makeCluster(4, type = "SOCK")
clusterExport(cl, "fn")
tmp <- parSapply(cl, 1:10000, function(x){fn()})
#2000回もすれば収束していた(図は略)。
#行が引く回数、列がシミュレーション回数になっている。
res <- rowMeans(tmp)
plot(res, type="l")
abline(h=0.95, lty=2, col="red")
head(which(res > 0.95), n=1) #答え
sort(res)