6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PythonAdvent Calendar 2023

Day 11

Pythonでコンプガチャの期待値を求める

Last updated at Posted at 2023-12-10

概要

マクドナルドでとあるキャンペーンを行うようです。

マクドナルドのハッピーセット「ハローキティ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)

出力したグラフです。なめらかな二次曲線になりました。

Figure_1.png

終わりに

今回はコンプガチャの期待値を計算するプログラムを書きました。
基礎的なコード紹介となったので、Python入門者の参考になればと思います。

あと、キティちゃん50種類すべて集めるのは、金銭面やカロリー面で厳しいので諦めますが、皆さんも、キャンペーン期間中にマクドナルドへ足を運んでみてください。(※マクドナルドの回し者ではありません。)

ここまで読んでいただきありがとうございました。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?