- ベストアンサー
出る確率が異なるガチャガチャを揃える
今、以下のように出現確率が異なるガチャガチャを回すとします。 全16種類を揃えるまでに必要な回数は何回でしょうか? ノーマル 4種類 1/10 レア 6種類 1/15 プレミア 6種類 1/30
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
マジメに平均試行回数を計算しようとすると期待値がきちんと収束するか,など気にしなければならず,面倒です.また恐らくそのままでは式が複雑すぎて適当な近似をしなければ使い物にならないでしょう. そこで安直に計算機でシミュレートしてみました(参考URL).これで1000回ガチャガチャを回してみたところ平均試行回数は77.755回,その標本標準偏差は34.3054491129回でした.かなり大雑把な計算ですが目安くらいにはなるでしょう.(120回もやれば大抵すべて揃うということ.) ## 精度を上げたいならば,もっといろいろ工夫しなければなりませんね.
その他の回答 (10)
- nag0720
- ベストアンサー率58% (1093/1860)
No.3です。 他の方々のシミュレーションの結果で76~77回ぐらいと出ているようですが、 No.3で書いた式で計算してみると、回数の期待値は76.5337回になります。
お礼
回答No.3-11まで、わざわざプログラミングして解を求めて下さり ありがとうございます。 まとめてですがお礼申し上げます。 m(_ _)m
Rでのシミュレーション結果がすでにありますが、このまま削除するのももったいない気がするので・・・。 1万回試したところ、 > x <- sim(10000) > mean(x) [1] 76.8808 > sd(x) [1] 33.87991 #4さん、#5さんと同様の結果になりました。 以下、使用したコード。 エラー処理及びコメントなし。 gacha2 <- function(n) { p <- rep(c(1/10,1/15,1/30), times = c(4,6,6)) findInterval(runif(n), c(0,cumsum(p))) } sim <- function(r) { results <- numeric(r) indexMax <- 10000 index <- indexMax + 1 for (i in seq(along.with = results)) { items <- rep(FALSE, times = 4+6+6) j <- 0 while(sum(items) < 4+6+6) { if(index > indexMax) { x <- gacha2(indexMax) index = 1 } items[x[index]] = TRUE index = index + 1 j = j + 1 } results[i] = j } return(results) } x <- sim(10000) mean(x) sd(x)
- kamiyasiro
- ベストアンサー率54% (222/411)
#5です。 前の x <- data.frame() や x <- NULL を先頭に置くことはやめて、 x[1:16] <- 0 の部分を x <- rep(0,16) にするのがいいです。 何度もすみません。 なんでRが、初出の x[1:16] <- 0 をエラーにするのか分かりません。
- kamiyasiro
- ベストアンサー率54% (222/411)
#5です。 Rのスクリプトですが、最初に、 x <- 0 とか、入れておかないとエラーになるみたいです。
- kamiyasiro
- ベストアンサー率54% (222/411)
#5です。 Rのスクリプトですが、最初に、 x <- data.frame() を宣言しておくことを忘れていました。
- kamiyasiro
- ベストアンサー率54% (222/411)
#5です。 期待値はどんなか、というときは、確率密度分布を見て考えれば良いです。つまり、 私の書いたスクリプトのk回でゲットという数がどういう分布かを見れば良いです。 Rで > hist(k,breaks=30) というコマンドでヒストグラムができるので見てください。 どうやら、カイ2乗分布に近いような分布になっています。 大きい側に尾を引きます。 これによると、平均的には70数回ですが、 最大250回、確実に得るには、やはり200回くらい必要な感じです。
- kamiyasiro
- ベストアンサー率54% (222/411)
#4さんへ、 1回多いんじゃないでしょうか。 カウンタの取り方、間違っていませんか。 私はRのスクリプト書いてみました。 1万回の試行で数十秒です。 (全角スペースで行頭下げをやっていますので半角に変更して下さい。 コメントの前のスペースも同じです) k <- NULL s <- 1 while(s <= 10000){ i <- 1 #iは試行回数 c <- 0 #cは全部揃ったときのフラグ x[1:16] <- 0 #xは手に入ったときのフラグ while(c < 1){ v <-runif(1,min=0,max=30) if( 0<v && v<= 3){x[ 1] <- 1} #ノーマル if( 3<v && v<= 6){x[ 2] <- 1} #ノーマル if( 6<v && v<= 9){x[ 3] <- 1} #ノーマル if( 9<v && v<=12){x[ 4] <- 1} #ノーマル if(12<v && v<=14){x[ 5] <- 1} #レア if(14<v && v<=16){x[ 6] <- 1} #レア if(16<v && v<=18){x[ 7] <- 1} #レア if(18<v && v<=20){x[ 8] <- 1} #レア if(20<v && v<=22){x[ 9] <- 1} #レア if(22<v && v<=24){x[10] <- 1} #レア if(24<v && v<=25){x[11] <- 1} #プレミア if(25<v && v<=26){x[12] <- 1} #プレミア if(26<v && v<=27){x[13] <- 1} #プレミア if(27<v && v<=28){x[14] <- 1} #プレミア if(28<v && v<=29){x[15] <- 1} #プレミア if(29<v && v<=30){x[16] <- 1} #プレミア if(prod(x) == 0){ i <- i+1} #iを増やして続行 else { c = 1} #揃ったらcに1を立てる } k <- append(k,i) #k回で揃ったことを記録 s <- s+1 #シミュレーション数 } > mean(k) [1] 76.7108 > sd(k) [1] 33.56216
- nag0720
- ベストアンサー率58% (1093/1860)
一般化したときの期待値の算出式を書いておきます。 n種類の出現確率をp[i] (1≦i≦n , Σp[i]=1) とする。 m回ガチャガチャを回したとき、i番目以外のn-1種類がそろっている確率をP[m,i]とすれば、 P[m,i]=Σ[k=1~n-1](-1)^(n-k+1)*Σ(p[i1]+p[i2]+p[i3]+・・・+p[ik])^(m-1) ただし、2番目のΣの範囲は、1≦i1<i2<i3<・・・<ik≦n かつ i1,i2,i3,・・・,ik≠i を満たすk個の整数の組 コンプリートする回数の期待値は、 期待値=Σ[k=1~∞]k*Σ[i=1~n]P[k-1,i]*p[i] n=5くらいまでなら手作業でもなんとかなりそうですが、n=16となるととてもじゃないが手作業では無理です。プログラムを組むしかないでしょう。
お礼
回答ありがとうございます。 この問題の状況にはわりとよく遭遇するけど、 答えは案外と複雑で難しいもんなんですね。
- shuu_01
- ベストアンサー率55% (759/1365)
> その確率だと合計が1になっていないので、 > 確率を求めることができません。 4X 1/10 + 6 X 1/15 + 6 X 1/30 = 12/30 + 12/30 + 6/30 = 30/30 = 1 で合計1です > 全16種類を揃えるまでに必要な回数は > 何回でしょうか? 平均 何回でしょうか? って質問ですか? それとも、最低 何回でしょうか? かな? 最低 何回なら、4 + 6 + 6 = 16回です
お礼
もちろん平均試行回数です。 ・1回100円とした場合の期待値と分散 ・この問題を一般化した場合 もお願いします。
- omaru888888
- ベストアンサー率0% (0/1)
その確率だと合計が1になっていないので、確率を求めることができません。 ノーマル、レア、プレミアが6対5対2の確率で出るということを言いたいのならば プレミアが6種類ということで確率はものすごく低くなります。 計算すると、約1000回ほど引いてやっと確率が2分の一になる計算ですね。
お礼
シミュレーション的に解を求めると 77回ということで、なかなか多いと感じました。