前回の記事で、コンプガチャの期待値と分散を求めましたが、いまいち自信がなかったのでシミュレーションしてみました。
参考: 全種類の景品を集めるのに必要な回数の期待値
おさらいしておくと、$n$種類の景品があるクジを景品が全種類揃うまで引く回数は、
期待値が$n\sum_{k=1}^{n}\frac{1}{k}$, 分散が$n\sum_{k=1}^{n-1}\frac{k}{(n-k)^2}$です。
実際にそのような結果になるのか、仮に$n=20$として、プログラムで繰り返し実行してみましょう。
ちなみに、$n=20$の場合の期待値と分散は次ようになります。
import numpy as np
n = 20
# 期待値
print(sum(n/np.arange(1, n+1)))
# 71.95479314287363
# 分散
print(sum([n*k/(n-k)**2 for k in range(1, n)]))
# 566.5105044223357
シミュレーションに使うために、景品が全種類揃うまでクジを引く関数を実装します。
def complete_gacha(n):
# 揃ったアイテムの配列
item_list = []
# n種類揃うまでクジを引く
while len(set(item_list)) < n:
item_list.append(np.random.randint(n))
return item_list
ためしに$n=5$で実行すると次のような結果が得られます。
print(complete_gacha(5))
# [4, 2, 0, 2, 4, 1, 3]
それでは、この関数を100000回実行し、回数(=返された配列の長さ)のリストを作って、平均値と不変分散を出してみましよう。
result_list = np.array([len(complete_gacha(20)) for _ in range(100000)])
# 期待値
print(result_list.mean())
# 71.86858
# 不偏分散
print(result_list.var(ddof=1))
# 566.9716985005849
試行回数がかなり大きいのもあって、理論値にかなり近い結果が得られましたね。
どうやら前回の記事の結果は一応正しそうです。