何をしたいのか
書籍の展示即売会を予定しています。書籍の価格は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)
それぞれの支払いが独立と仮定したので、数人以上の合計は正規分布とみなせます。
シミュレーションして確かめてみます。
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
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を使って計算できます。
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 |
以上