質問の期待値の問題をPythonで解いてみた。(2)

 質問の期待値の問題をPythonで解いてみました。(^_^;

『100面サイコロを2つ振り、出た数2つのうち大きい方を採用する、という場合の期待値を求めよ。』

 「大きい方を採用する」というのがクセ者で、同じ数が出た場合、どっちも大きい方ではないのでカウントしないという立場があります。この方針で質問の回答は解かれているようです。
 それはそれでいいのですが、一方、「等しい場合も含む」という立場もあります。この方針で、max関数を用いて「最大値を採用する」と解釈することにして解いてみました。(^_^;
 プログラムでは、count[0]でトータルの回数を、count[n]でn(=1〜100)が採用された場合の数をカウントしました。
 ちなみに、数学的に解くと、
\sum_{n=1}^{100} {n\times\frac{1+2(n-1)}{10000}}=\frac{1}{10000}\sum_{n=1}^{100}{n(2n-1)}=\dots(ry

● ExpectedValue2.py

# coding: UTF-8
# ExpectedValue2.py

import itertools
from time import time
from fractions import Fraction

def main():
    tm=time()  # Timer Start

    # count[0]でtotalを、count[n]でn(=1~100)が採用された場合の数をカウント
    count = [0]*101
    for p in itertools.product(range(1,101),repeat=2):
        count[0]+=1
        count[max(p)]+=1

    num, den = 0,count[0]
    for n in range(1,101):
        print("%3d:%3d"%(n,count[n]))
        num+=n*count[n]

    fra = Fraction(num,den)
    print(u"∴ %d / %d = %s = %g"%(num,den,fra,float(fra)))
    print("Runtime : %.3f [sec]"%(time()-tm))   # Timer Stop & Disp

if __name__ == '__main__':
    main()

●実行結果

  1:  1
  2:  3
  3:  5
  4:  7
  5:  9

…(省略)…

 98:195
 99:197
100:199
∴ 671650 / 10000 = 13433/200 = 67.165
Runtime : 0.067 [sec]

※参考URL
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1298119457
質問の期待値の問題をPythonで解いてみた。 - rscの日記