ピクミンブルーム 花札デコの苗26個で平均何種類の絵柄が手に入るか?【推移行列のn乗】

クーポンコレクター問題で、推移行列(※)のn乗を利用することで「全24種の花札デコを、苗26個取得すると何種類の絵柄が手に入るか?」を求められるので、その解析結果とシミュレーションプログラムをまとめてみました。

 

※全C種類、現在の所持クーポン数 k個のとき、(C+1)次正方行列に

  • 列に現在の所持デコ数
  • 行に1個デコ化後の所持デコ数

を取り、各セルに推移確率を設定してn乗し、スタート時の所持デコ数にあたる列をとると、n個デコ化後の所持デコ数の確率分布になる

 

全24種デコの苗を26回取得して手に入る種類数の分布

確率分布
  • x軸:26回取得後に手に入れているデコ種類数
  • y軸:その確率
16種類前後が多い感じです。
期待値と確率表

確率は小数第3位まで記載しています。変更する場合はシミュレーションプログラムの#部分をもとに設定可能です。

●全 24 種、 0 種入手済、 苗取得 26 回

平均: 16.06325012783161 種

0 → 0 種類: 0.0 %
0 → 1 種類: 0.0 %
0 → 2 種類: 0.0 %
0 → 3 種類: 0.0 %
0 → 4 種類: 0.0 %
0 → 5 種類: 0.0 %
0 → 6 種類: 0.0 %
0 → 7 種類: 0.0 %
0 → 8 種類: 0.0 %
0 → 9 種類: 0.001 %
0 → 10 種類: 0.012 %
0 → 11 種類: 0.13 %
0 → 12 種類: 0.868 %
0 → 13 種類: 3.744 %
0 → 14 種類: 10.636 %
0 → 15 種類: 20.13 %
0 → 16 種類: 25.491 %
0 → 17 種類: 21.533 %
0 → 18 種類: 12.005 %
0 → 19 種類: 4.33 %
0 → 20 種類: 0.978 %
0 → 21 種類: 0.131 %
0 → 22 種類: 0.01 %
0 → 23 種類: 0.0 %
0 → 24 種類: 0.0 %

 

プログラム

別の場合を試す場合、

  • Coupon = 24 #デコ種類数
  • k = 26 #苗取得回数
  • have = 0 #すでに持っているデコ数

を自由に書き換えてお使いください。

import numpy as np
import matplotlib.pyplot as plt
import math


Coupon = 24 #デコ種類数
k = 26 #苗取得回数
have = 0 #すでに持っているデコ数


A=[0]*(Coupon+1)
for i in range(0,Coupon+1):
    A[i] = [0]*(Coupon+1)

for i in range(0,Coupon+1):
    for j in range(0,Coupon+1):
        if i==j:
            A[j][i] = i/Coupon
        elif i==j-1:
            A[j][i] = (Coupon-i)/Coupon

B = np.linalg.matrix_power(A, k)

x = [i for i in range(Coupon+1)]
y = [0]*(Coupon+1)

print("●全", Coupon,"種、", have,"種入手済、","苗取得", k,"回")

for i in range(0,Coupon+1):
    if i >= have:
        y[i] = B[i][have]

print()
print("平均:", sum([i*j for (i,j) in zip(x,y)]), "種")
print()

for i in range(0,Coupon+1):
    if i >= have:
        print(have,"→",i,"種類:",round(100 * B[i][have], 3),"%") #表示する小数点以下の数(3)は要調整

plt.bar(x, y)
plt.xticks(np.arange(0, Coupon+1, step=1))
plt.grid(linestyle="--")
plt.show()

 

回数とデココンプ達成率の関係について

問:24種類あるデコのうち、せめて約8割である19種類が欲しい(達成率80%)とき、何回くらい苗を取得すればいいか?

 

答:全24種の1.6倍くらい、つまり38回くらい取得すれば平均で19種ゲットくらいにはなる

一般化にデコ種類数が十分大きい場合、全種類数のk倍集めると達成率は平均1-1/e^k

 

グラフ
  • x軸:全デコ種類数の何倍の個数を集めたか
  • y軸:収集率の期待値(=集まったデコ数 / 全デコ種類数)
確率表

平均で63%集めたいなら24種の1倍、86%集めたいなら2倍の48個の苗取得、3倍で95%

0.0 倍: 0.0 %
0.1 倍: 9.516 %
0.2 倍: 18.127 %
0.3 倍: 25.918 %
0.4 倍: 32.968 %
0.5 倍: 39.347 %
0.6 倍: 45.119 %
0.7 倍: 50.341 %
0.8 倍: 55.067 %
0.9 倍: 59.343 %
1.0 倍: 63.212 %
1.1 倍: 66.713 %
1.2 倍: 69.881 %
1.3 倍: 72.747 %
1.4 倍: 75.34 %
1.5 倍: 77.687 %
1.6 倍: 79.81 %
1.7 倍: 81.732 %
1.8 倍: 83.47 %
1.9 倍: 85.043 %
2.0 倍: 86.466 %
2.1 倍: 87.754 %
2.2 倍: 88.92 %
2.3 倍: 89.974 %
2.4 倍: 90.928 %
2.5 倍: 91.792 %
2.6 倍: 92.573 %
2.7 倍: 93.279 %
2.8 倍: 93.919 %
2.9 倍: 94.498 %
3.0 倍: 95.021 %
3.1 倍: 95.495 %
3.2 倍: 95.924 %
3.3 倍: 96.312 %
3.4 倍: 96.663 %
3.5 倍: 96.98 %
3.6 倍: 97.268 %
3.7 倍: 97.528 %
3.8 倍: 97.763 %
3.9 倍: 97.976 %
4.0 倍: 98.168 %
4.1 倍: 98.343 %
4.2 倍: 98.5 %
4.3 倍: 98.643 %
4.4 倍: 98.772 %
4.5 倍: 98.889 %
4.6 倍: 98.995 %
4.7 倍: 99.09 %
4.8 倍: 99.177 %
4.9 倍: 99.255 %
5.0 倍: 99.326 %

全デコ数が十分大きい場合、全デコ数の1倍は1-1/e≒0.63
2倍は1-1/e^2、3倍は1-1/e^3、k倍は1-1/e^k

に収束する

出力に使ったプログラム

デコ数が大きい場合は近似値1-1/e^xでOK

そうでない場合、24種類の場合は1-(23/24)^24x

import math
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 5.1, 0.1)
y = [1-1/np.e**k for k in x]

plt.xticks(np.arange(0, 5.5, step=0.5))
plt.plot(x, y)
plt.grid(linestyle="--")
plt.show()

for i in x:
    print(round(i,1),"倍:",round(100*(1-1/np.e**i),3),"%")

 

参考:コンプリートまでの期待値計算プログラム

単純に幾何分布の期待値の和をするだけのプログラムです。

 

プログラム
  • 関数:gsum(k,C):全C種のデコを手持ちk種からコンプする期待値(0≦k≦C)
  • 引数:k:そのデコの手持ち数(0≦k≦C)、 C:デコの種類数
#全C種のデコを手持ちk種からコンプする期待値(0≦k≦C)

def gsum(k,C):
    a = 0
    for i in range (k,C):
        a += 1/(C-i)
    return C * a

gsum(17,24)  #関数の実行。全24種を手持ち17個からコンプする期待値
出力結果

gsum(17,24):全24種を手持ち17個からコンプする期待値

62.22857142857142

 

コメント

タイトルとURLをコピーしました