Python
シミュレーション
数学
確率
More than 1 year has passed since last update.

何をしたいのか

書籍の展示即売会を予定しています。書籍の価格は3000円です。
購入者は、多くても50人とします。お釣りが不足しないようにするには、1000円札と5000円札を何枚用意すればいいでしょうか?

絶対に不足させない場合

可能性としては、以下の3パターンを考えます。

支払い方法 お釣り
1000円札3枚 なし
5000円1枚 1000円2枚
10000円1枚 5000円1枚と1000円2枚

1万円のパターンがすべてのパターンの枚数を包含しているので、最悪ケースは、50人とも1万円で払うときになり、1000円が100枚、5000円が50枚の合計35万円分のお釣りを用意することになります。

なるべく不足させない場合

50人ともが1万円という確率は、限りなく小さいでしょう。
財布の中身のシミュレーションより、財布の中身を以下の確率とし、それぞれの財布の中身は独立と仮定します。

お札の枚数 確率
1000円札0枚 20%
1000円札1枚 20%
1000円札2枚 20%
1000円札3枚 20%
1000円札4枚 20%
5000円0枚 50%
5000円1枚 50%

このことから、支払いパターンの確率は次のようになります。(お札があれば使うものとします)

支払い方法 お釣り 確率
1000円札3枚 なし 40%
5000円1枚 1000円2枚 30%
10000円1枚 5000円1枚と1000円2枚 30%

(1万円の確率 = 5000円0枚 × 1000円(0~2枚) = 0.5 × (0.2 + 0.2 + 0.2) = 0.3)

それぞれの支払いが独立と仮定したので、数人以上の合計は正規分布とみなせます。
シミュレーションして確かめてみます。

python
r = []
for i in range(100000):
    n = 100
    p = np.random.rand(50)
    for x in p:
        if x < 0.3:
            n += 1
        elif x < 0.6:
            n -= 1
    r.append(n)
r = np.array(r)
plt.hist(r, bins=20, range=(50, 150))
print('%.3f %.3f' % (r.std(), math.sqrt(50 * 0.6)))
>>>
5.472 5.477

image

1000円札の枚数と5000円札の枚数の分布は、以下のようになります。

1000円札の枚数分布 ~ $N(n \mu_{1000}, n \sigma^2_{1000})$
$\mu_{1000} = 0.4 ~ ~ 3 + 0.3 ~ (-2) + 0.3 ~ (-2) = 0$
$\sigma^2_{1000} = 0.4 (3-0)^2 + 0.3 (-2-0)^2 + 0.3 (-2-0)^2 = 6$

5000円札の枚数分布 ~ $N(n \mu_{5000}, n \sigma^2_{5000})$
$\mu_{5000} = 0.4 ~ ~ 0 + 0.3 ~ 1 + 0.3 ~ (-1) = 0$
$\sigma^2_{5000} = 0.4 (0-0)^2 + 0.3 (1-0)^2 + 0.3 (-1-0)^2 = 0.6$

お釣りが足りなくてもよい確率を5%とすると、両側 t分布表の(0.1, 50)のところの1.67591を使って計算できます。

python
tv = 1.67591 
print('1000円 %.3f' % (math.sqrt(50 * 6) * tv))
print('5000円 %.3f' % (math.sqrt(50 * 0.6) * tv))
>>>
1000 29.028
5000 9.179

結局、1000円が30枚、5000円が10枚の合計8万円分のお釣りを用意することになります。(途中で不足するのではなく、最後に不足するかどうかで計算しています)
このとき、どちらかが不足する確率は、単純に計算すると 約10%($=1-(1-0.05)^2$)ですが、実際には、下記のように考えられるので、5%と言えます。

ケース 確率 意味
1000円が余る 5000円が余る 0.9025 OK
1000円が余る 5000円が不足 0.0475 余った1000円でも返せるのOK
1000円が不足 5000円が余る 0.0475 NG
1000円が不足 5000円が不足 0.0025 NG

以上