質問の期待値の問題をPythonで解いてみました。(^_^;
『100面サイコロを2つ振り、出た数2つのうち大きい方を採用する、という場合の期待値を求めよ。』
「大きい方を採用する」というのがクセ者で、同じ数が出た場合、どっちも大きい方ではないのでカウントしないという立場があります。この方針で質問の回答は解かれているようです。
それはそれでいいのですが、一方、「等しい場合も含む」という立場もあります。この方針で、max関数を用いて「最大値を採用する」と解釈することにして解いてみました。(^_^;
プログラムでは、count[0]でトータルの回数を、count[n]でn(=1〜100)が採用された場合の数をカウントしました。
ちなみに、数学的に解くと、
● 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の日記