概要
マクドナルドでとあるキャンペーンを行うようです。
マクドナルドのハッピーセット「ハローキティ50周年」
- 第1弾 12月15日(金)~12月21日(木) キティのぬいぐるみ25種
- 第2弾 12月22日(金)~12月28日(木) キティのぬいぐるみ25種
- 第3弾 12月29日(金)~ 第1弾・第2弾で登場した全50種
50種全部ほしいのですが、どうやらランダムっぽいです。
そこで、コンプできる回数の期待値はどうなるか、気になってしまったので、コンプガチャと見立てて、Pythonでプログラムを作成していこうと思います。
コンプガチャの期待値を計算
まず前提として、確率は全部均等とします。また、順番も完全ランダムとします。
コンプガチャの期待値を求める式は以下の通りです。
コンプガチャ期待値=n\sum_{k=1}^{n} \frac{1}{k}
$\sum$(シグマ)に抵抗がある方もいると思いますが、分かりやすい式に書き換えると以下の通りです。
コンプガチャ期待値=n×(1 + \frac{1}{2} + \frac{1}{3} +⋯+ \frac{1}{n})
Pythonで書くとこんな感じです。
def comp_gacha(n: int) -> float:
'''
ガチャをコンプするまでの期待値を求める
Args:
n (int): ガチャで当たる商品の種類数
Returns:
float: コンプまでの期待値
'''
sum = 0.0
for i in range(1, n + 1):
sum += 1 / i
return n * sum
さらに、内包表記を使って書くと1行で済みます。($\sum$もたいしたことないですね)
def comp_gacha(n: int) -> float:
'''
ガチャをコンプするまでの期待値を求める
Args:
n (int): ガチャで当たる商品の種類数
Returns:
float: コンプまでの期待値
'''
return n * sum(1 / (i + 1) for i in range(n))
実行結果は以下の通りです。
25個の期待値が95.4回なので、第1弾と第2弾を合計すると190.8回。
第3弾だけでは、224.96回 必要なので、全部集めるなら第1弾と第2弾で集めきったほうが良さそうです。
ガチャで当たる商品の種類数 | コンプまでの期待値 |
---|---|
1個 | 1回 |
2個 | 3回 |
3個 | 5.5回 |
4個 | 6.33回 |
5個 | 11.42回 |
10個 | 29.29回 |
25個 | 95.4回 |
50個 | 224.96回 |
matplotlibを使ってグラフを表示
matplotlib
を使って、ガチャの個数毎の期待値をグラフで表示します。
import matplotlib.pyplot as plt
def comp_gacha(n: int) -> float:
'''
ガチャをコンプするまでの期待値を求める
Args:
n (int): ガチャで当たる商品の種類数
Returns:
float: コンプまでの期待値
'''
return n * sum(1 / (i + 1) for i in range(n))
def plot_comp_gacha(n: int):
'''
ガチャをコンプするまでの期待値をグラフで表示
Args:
n (int): ガチャで当たる商品の種類数
'''
x = list(range(1, n + 1))
y = [comp_gacha(i) for i in range(1, n + 1)]
plt.plot(x, y, 'ro', color='forestgreen')
plt.plot(x, y, color='forestgreen')
plt.xlabel("ガチャで当たる商品の種類数", fontsize=18, fontname='MS Gothic')
plt.ylabel("コンプまでの期待値", fontsize=18, fontname='MS Gothic')
plt.grid()
plt.show()
n = 50
plot_comp_gacha(n)
出力したグラフです。なめらかな二次曲線になりました。
終わりに
今回はコンプガチャの期待値を計算するプログラムを書きました。
基礎的なコード紹介となったので、Python入門者の参考になればと思います。
あと、キティちゃん50種類すべて集めるのは、金銭面やカロリー面で厳しいので諦めますが、皆さんも、キャンペーン期間中にマクドナルドへ足を運んでみてください。(※マクドナルドの回し者ではありません。)
ここまで読んでいただきありがとうございました。