【WoWs】コレクション完成に必要な個数は?【はいふり】
World of Warships(通称WoWs)というオンラインゲームがあります。軍艦を操作し、砲撃や魚雷などで相手を沈め、チームを勝利に導くことが目的のゲームです。自分もかれこれ2年以上プレイを続けています。
さて、このゲームにはコレクションという収集要素があるのですが、今やってる「ハイスクール・フリート」とのコラボイベントでは、キャラクターを模したコレクションを集めることができます。全部集めると旗や大和の迷彩などが貰え、特に迷彩はゲーム内リソースの節約に繋がるので是非とも集めたい感じです。
ここからが数学です。
問題 コレクションは全部で35種類あります。1回でランダムに1個手に入りますが、重複が5個集まればまだ持ってない1種類と交換できます。全部で何個コレクションを集めればコンプリートできるでしょうか?
まず条件を整理しましょう。コレクションは全部で種類、1回で1個手に入る確率はとします。重複が個で交換できるとします。
所持している種類が種類になってから種類になるまでにかかる回数を表す確率変数をとします。この回数が回になる確率は、回既に持っている種類を入手し、回目に新しい種類を入手する確率なので、
になります。ここで
に注意すれば、
となります。
今考えたいのはの場合です。すると種類集めるまでの回数の期待値は
と分かります。故に
を満たす最小のに対し、が求める値になります。
として計算すると、で回となるので、約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
をヒストグラムで表示すると以下の図になりました。
意外なことに、周期4でピークが出ています。また運が悪いと70回近くかかる人が出てくることが分かります。(バランス的に期待値60じゃない気がするんですが…どこか間違えたか?)
ところで、イベントではHSF Harekaze及びHSF Graf Speeという二種類の課金艦、及び大和(tier10なので相当やらないと所持できない)と武蔵(フリー経験値で購入なので大和以上にやらないと手に入らない)でプレイすると、特殊なコンテナを一定数手に入れることができます。特に課金艦二つ(お船のみ合計約7000円になっております)では、20個ずつのコンテナが手に入り、コンテナ1つで2個、計80個のコレクションが手に入ります。上の図に依れば、運が悪くても80個あれば、まぁ間違いなくそろえることが出来ますね!
なおコラボ系の販売は2/7まで、またコラボ参加申請もそれくらい、特殊コンテナは4/30までと期間限定です。デイリーコンテナからも1個(確率で)出るのですが、こちらは9/30まで(色々ややこしい)