アプリ版:「スタンプのみでお礼する」機能のリリースについて

今、以下のように出現確率が異なるガチャガチャを回すとします。
全16種類を揃えるまでに必要な回数は何回でしょうか?

ノーマル 4種類 1/10
レア    6種類 1/15
プレミア 6種類 1/30

A 回答 (11件中1~10件)

マジメに平均試行回数を計算しようとすると期待値がきちんと収束するか,など気にしなければならず,面倒です.また恐らくそのままでは式が複雑すぎて適当な近似をしなければ使い物にならないでしょう.



そこで安直に計算機でシミュレートしてみました(参考URL).これで1000回ガチャガチャを回してみたところ平均試行回数は77.755回,その標本標準偏差は34.3054491129回でした.かなり大雑把な計算ですが目安くらいにはなるでしょう.(120回もやれば大抵すべて揃うということ.)
## 精度を上げたいならば,もっといろいろ工夫しなければなりませんね.

参考URL:http://aleph.sagemath.org/?q=abxpri
    • good
    • 0
この回答へのお礼

シミュレーション的に解を求めると
77回ということで、なかなか多いと感じました。

お礼日時:2014/01/13 18:29

No.3です。



他の方々のシミュレーションの結果で76~77回ぐらいと出ているようですが、

No.3で書いた式で計算してみると、回数の期待値は76.5337回になります。
    • good
    • 1
この回答へのお礼

回答No.3-11まで、わざわざプログラミングして解を求めて下さり
ありがとうございます。
まとめてですがお礼申し上げます。 m(_ _)m

お礼日時:2014/01/13 18:31

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)
    • good
    • 0

#5です。



前の
x <- data.frame()

x <- NULL
を先頭に置くことはやめて、

x[1:16] <- 0
の部分を
x <- rep(0,16)
にするのがいいです。

何度もすみません。

なんでRが、初出の
x[1:16] <- 0
をエラーにするのか分かりません。
    • good
    • 0

#5です。



Rのスクリプトですが、最初に、

x <- 0

とか、入れておかないとエラーになるみたいです。
    • good
    • 0

#5です。



Rのスクリプトですが、最初に、

x <- data.frame()

を宣言しておくことを忘れていました。
    • good
    • 0

#5です。


期待値はどんなか、というときは、確率密度分布を見て考えれば良いです。つまり、
私の書いたスクリプトのk回でゲットという数がどういう分布かを見れば良いです。

Rで
> hist(k,breaks=30)
というコマンドでヒストグラムができるので見てください。
どうやら、カイ2乗分布に近いような分布になっています。
大きい側に尾を引きます。

これによると、平均的には70数回ですが、
最大250回、確実に得るには、やはり200回くらい必要な感じです。
    • good
    • 0

#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
    • good
    • 0

一般化したときの期待値の算出式を書いておきます。



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となるととてもじゃないが手作業では無理です。プログラムを組むしかないでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
この問題の状況にはわりとよく遭遇するけど、
答えは案外と複雑で難しいもんなんですね。

お礼日時:2014/01/13 18:28

> その確率だと合計が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回です
    • good
    • 0
この回答へのお礼

もちろん平均試行回数です。
・1回100円とした場合の期待値と分散
・この問題を一般化した場合
もお願いします。

お礼日時:2013/12/26 12:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!