ryubloblog’s diary

宮城県の仙台で働くプログラマーです。

【Python】期待値の計算

期待値の計算のアルゴリズムを簡単にまとめていきたいと思います。

期待値とは

確率論において、確率変数の期待値(きたいち、英: expected value)とは、確率変数のすべての値に確率の重みをつけた加重平均である。確率分布に対して定義する場合は「平均」と呼ばれることが多い
出典: フリー百科事典『ウィキペディアWikipedia)』

ウィキペディアには上記のように記載されていますが、簡単にまとめると「1回の試行で得られる平均的な値」のことを期待値と言います。
大まかな例を挙げるとすると、ある賭け事があるとします。
その賭け事では、0.1%の確率で10000円、0.3%の確率で5000円、0.6%の確率で0円のリターンがあります。
この場合の期待値の計算方法は、
(10000 * 0.1) + (5000 * 0.3) + (0 * 0.6) = 2500(円)
になります。
よって、この賭け事の期待値は「2500円」という結果になります。
つまり、2500円以上を賭けてしまうと損であるということになります。
また、期待値の計算については「期待値の線形性」という性質があるので下記にまとめたいと思います。

期待値の線形性とは

期待値の線形性というのは、複数の期待値の和を求めたい場合に期待値は複数の期待値の和になる性質のことを言います。
例としては、1回目の施行の期待値をX1とし、2回目の施行の期待値をX2とします。
この場合に1回目と2回目の合計の期待値は「X1 + X2」になります。
1回目と2回目の期待値の合計 = 1回目の期待値(X1) + 2回目の期待値(X2)
これはN回の期待値の合計を求める際にも使用することができます。
1回目、2回目...N回目の期待値の合計 = 1回目の期待値 + 2回目の期待値... + N回目の期待値
では実際に、期待値を求めるプログラムを書いていきます。

2つのサイコロの期待値を求める

atcoder.jp

問題は上記になります。
こちらの問題で考えることとしては、先ほどの「期待値の線形性」を利用して「出目の合計の期待値」を求めることになります。
(出目の合計の期待値) = (青の出目の期待値) + (赤の出目の期待値)
出目の合計の期待値は上記の式のように表せるため、これを求めることで答えを導き出すことができます。

n = int(input())
b = list(map(int, input().split()))
r = list(map(int, input().split()))

blue, red = 0.0, 0.0
for i in range(n):
  blue += b[i] / n
  red += r[i] / n

print(blue + red)

ランダムに選択する場合の期待値

atcoder.jp

問題は上記になります。
こちらの問題でも「期待値の線形性」を利用して「合計点数の期待値」を求めることを考えましょう。
(合計点数の期待値) = (1問目の点数の期待値) + (2問目の点数の期待値) + ... + (N問目の点数の期待値)
合計点数の期待値は上記の式のように表せるため、これを求めます。

n = int(input())
answer = 0.0

for i in range(n):
  p, q = map(int, input().split())
  answer += q / p

print(answer)

最後に

今回は期待値の求め方と考え方について簡単にまとめてみました。
期待値を求めるテクニックとして足された回数を考えるというのもあるみたいなので、別の記事としてまとめたいと思います。