arXiv探訪

興味の赴くままに数学するだけ

【WoWs】コレクション完成に必要な個数は?【はいふり】

World of Warships(通称WoWs)というオンラインゲームがあります。軍艦を操作し、砲撃や魚雷などで相手を沈め、チームを勝利に導くことが目的のゲームです。自分もかれこれ2年以上プレイを続けています。

store.steampowered.com

さて、このゲームにはコレクションという収集要素があるのですが、今やってる「ハイスクール・フリート」とのコラボイベントでは、キャラクターを模したコレクションを集めることができます。全部集めると旗や大和の迷彩などが貰え、特に迷彩はゲーム内リソースの節約に繋がるので是非とも集めたい感じです。

f:id:mathmathniconico:20180131211348j:plain

f:id:mathmathniconico:20180131211357j:plain

ここからが数学です。

問題 コレクションは全部で35種類あります。1回でランダムに1個手に入りますが、重複が5個集まればまだ持ってない1種類と交換できます。全部で何個コレクションを集めればコンプリートできるでしょうか?

まず条件を整理しましょう。コレクションは全部で{ n }種類、1回で1個手に入る確率は{ p }とします。重複が{ a }個で交換できるとします。

所持している種類が{ k }種類になってから{ (k+1) }種類になるまでにかかる回数を表す確率変数を{ X_{k} }とします。この回数が{ t }回になる確率{ P(X_{k}=t) }は、{ (t-1) }回既に持っている種類を入手し、{ t }回目に新しい種類を入手する確率なので、

{ P(X_{k}=t)=(kp)^{t-1}(n-k)p }

になります。ここで

{ \displaystyle 1+2r+3r^{2}+\dotsb = \sum_{t=1}^{\infty}tr^{t-1}=\frac{1}{(1-r)^{2}} }

に注意すれば、

{ \displaystyle E\lbrack X_{k} \rbrack = \sum_{t=1}^{\infty}P(X_{k}=t)\cdot t=(n-k)p\sum_{t=1}^{\infty}t(kp)^{t-1}=\frac{(n-k)p}{(1-kp)^{2}} }

となります。

今考えたいのは{ p=\frac{1}{n} }の場合です。すると{ m }種類集めるまでの回数の期待値{ N_{m} }

{ \displaystyle N_{m}=E\lbrack X_{0}+\dotsb+X_{m-1} \rbrack=\sum_{k=0}^{m-1}\frac{n}{n-k}=n\left( \frac{1}{n}+\dotsb+\frac{1}{n-m+1} \right) }

と分かります。故に

{ \displaystyle \frac{1}{a}(N_{m}-m)+m\ge n }

を満たす最小の{ m }に対し、{ N_{m} }が求める値になります。

{ n=35, a=5 }として計算すると、{ m=29 }{ N_{m}=59.38 }回となるので、約60個集めれば期待値的にはコンプリートができることがわかります。(これはExcelで出した)

……ちょっと待ってください? 所謂ガチャに関して期待値だけを見るのは少々危険です。ちゃんと分布まで見ておくべきでしょう。

ということでjulia言語を使って1万人にガチャをやってもらいました。汚いですが、ソースはこんな感じ。

rng = MersenneTwister(1234)

size = 10000
sorts = 35
dupli = 5
counts = zeros(Int64, size)
tests = dupli * sorts

function notzeros(cards::Array{Int64, 1})
    res = 0
    for i in cards
        if (i != 0)
            res += 1
        end
    end
    return res
end

for j = 1:size
    cards = zeros(Int64, sorts)
    for i = 1:tests
        index = rand(rng, 1:sorts)
        cards[index] += 1
        collected = notzeros(cards)
        if ((i - collected) / dupli + collected >= sorts)
            counts[j] = i
            break
        end
    end
end

countsヒストグラムで表示すると以下の図になりました。

f:id:mathmathniconico:20180131213016p:plain

意外なことに、周期4でピークが出ています。また運が悪いと70回近くかかる人が出てくることが分かります。(バランス的に期待値60じゃない気がするんですが…どこか間違えたか?)

ところで、イベントではHSF Harekaze及びHSF Graf Speeという二種類の課金艦、及び大和(tier10なので相当やらないと所持できない)と武蔵(フリー経験値で購入なので大和以上にやらないと手に入らない)でプレイすると、特殊なコンテナを一定数手に入れることができます。特に課金艦二つ(お船のみ合計約7000円になっております)では、20個ずつのコンテナが手に入り、コンテナ1つで2個、計80個のコレクションが手に入ります。上の図に依れば、運が悪くても80個あれば、まぁ間違いなくそろえることが出来ますね!

なおコラボ系の販売は2/7まで、またコラボ参加申請もそれくらい、特殊コンテナは4/30までと期間限定です。デイリーコンテナからも1個(確率で)出るのですが、こちらは9/30まで(色々ややこしい)