前々回の宿題をまずはモジュール化してみましょう.
解答例(本体) モジュール(オイラー式) モジュール(階乗)
前回も扱った学生10人の3教科のテストの点数表ですが,それぞれの科目で最高点を取った人の情報を以下のように提示するプログラムを作成してみましょう.
No. Eng Math Phys Total 1 10 21 87 118 2 72 37 81 190 3 30 70 43 143 4 34 98 71 203 5 11 88 3 102 6 47 40 91 178 7 84 2 79 165 8 79 37 49 165 9 47 38 83 168 10 20 67 71 158 Best scores Subject Student No. Score Eng 7 84 Math 4 98 Phys 6 91 |
学生番号と最高得点を返す関数をモジュールにしてみました.成績リストが引数として与えられると,その行と列を入れ替えることで,各科目の最高点を max 関数で求められます.そして,index メソッド(教科書 p.175)でその要素があるリストのインデックスも見つけられます.
今回は同じ最高得点が2つ以上出てきた場合には小さい方の番号しか出ない処理になっています.
解答例(本体)
解答例(モジュール)
一様分布な乱数を発生させる randint 関数ですが,一様分布な乱数の平均値を何度か求めていくと,平均値の平均値は正規分布に従う値になります.(中心極限定理)
10個の2桁の正の整数を発生させることを10回行いますが,その際に各回の平均値と標準偏差も計算します.そして,5回目以降は平均値の平均値と平均値の平均値の標準偏差も求め,乱数が増えるたびに平均値の標準偏差の値が落ち着いていくかどうかを観察するプログラムを作成しましょう.
下の実行結果は10個の数値を表示した後で,その10個の平均値,10個の数の標準偏差,平均値の平均値,平均値の平均値の標準偏差,の順になっています.
1: 18 89 17 79 12 28 90 57 38 11 43.9 32.22 2: 45 39 75 55 75 40 90 59 16 26 52.0 23.32 3: 76 89 91 25 78 82 67 50 25 30 61.3 26.56 4: 70 75 81 46 20 64 49 19 36 55 51.5 21.75 5: 70 95 60 92 15 53 88 27 59 87 64.6 27.52 50.2 4.28 6: 59 64 57 47 57 93 44 26 65 25 53.7 19.88 50.9 4.21 7: 19 14 66 91 51 87 91 55 62 34 57.0 28.24 51.5 4.12 8: 64 95 87 47 78 68 38 37 70 27 61.1 22.89 52.0 4.09 9: 25 14 39 23 93 43 85 30 87 42 48.1 29.23 52.3 3.93 10: 81 63 32 92 79 59 49 86 94 37 67.2 22.57 52.7 3.89 |
発生した乱数を入れる10×10のリスト,平均値を入れるリスト,平均値の平均値を入れるリストを用意しました.
なお,ここでは特にモジュールに分けることを意識しなくても大丈夫です.import 文で from を活用して statistics.mean や statistics.stdev などのモジュールを簡単に読み込むようにしましょう.
解答例
Python の random モジュールには正規分布に従う乱数(浮動小数点数)を発生させる gauss 関数が用意されています.gauss 関数は引数に平均値と標準偏差を与えて使用します.
今,平均値が 50 で標準偏差が 10 の整数の乱数を1000個発生させて,その度数分布が実際に正規分布となっているかを確認するプログラムを作成しましょう.
1 - 0 - 0 2 - 0 - 0 3 - 0 - 0 4 - 0 - 0 5 - 0 - 0 6 - 0 - 0 7 - 0 - 0 8 - 0 - 0 9 - 0 - 0 10 - 0 - 0 11 - 0 - 0 12 - 0 - 0 13 - 0 - 0 14 - 0 - 0 15 - 0 - 0 16 - 1 - 1 17 - 1 - 2 18 - 0 - 2 19 - 0 - 2 20 - 0 - 2 21 - 0 - 2 22 - 1 - 3 23 - 1 - 4 24 - 1 - 5 25 - 0 - 5 26 - 4 - 9 27 - 1 - 10 28 - 4 - 14 29 - 4 - 18 30 - 5 - 23 31 - 5 - 28 32 - 6 - 34 33 - 7 - 41 34 - 12 - 53 35 - 14 - 67 36 - 10 - 77 37 - 11 - 88 38 - 14 - 102 39 - 21 - 123 40 - 23 - 146 41 - 28 - 174 42 - 22 - 196 43 - 34 - 230 44 - 34 - 264 45 - 41 - 305 46 - 32 - 337 47 - 56 - 393 48 - 32 - 425 49 - 43 - 468 50 - 48 - 516 51 - 39 - 555 52 - 37 - 592 53 - 45 - 637 54 - 35 - 672 55 - 33 - 705 56 - 29 - 734 57 - 25 - 759 58 - 32 - 791 59 - 22 - 813 60 - 22 - 835 61 - 24 - 859 62 - 11 - 870 63 - 17 - 887 64 - 18 - 905 65 - 15 - 920 66 - 14 - 934 67 - 16 - 950 68 - 12 - 962 69 - 7 - 969 70 - 6 - 975 71 - 4 - 979 72 - 5 - 984 73 - 8 - 992 74 - 2 - 994 75 - 3 - 997 76 - 0 - 997 77 - 1 - 998 78 - 0 - 998 79 - 0 - 998 80 - 1 - 999 81 - 0 - 999 82 - 0 - 999 83 - 0 - 999 84 - 1 - 1000 85 - 0 - 1000 86 - 0 - 1000 87 - 0 - 1000 88 - 0 - 1000 89 - 0 - 1000 90 - 0 - 1000 91 - 0 - 1000 92 - 0 - 1000 93 - 0 - 1000 94 - 0 - 1000 95 - 0 - 1000 96 - 0 - 1000 97 - 0 - 1000 98 - 0 - 1000 99 - 0 - 1000 100 - 0 - 1000 |
左列は1から100までの数で,中央列がその数が出た回数,右列は累積度数です.
フィルター関数を使用して,反復処理の利用を減らしましょう.
解答例
正規分布と似た形になるものに二項分布があります.コインを10枚投げて表が何枚出たかを数える作業を100回行った時の,表の枚数とその頻度を乱数を用いてシミュレートしてみましょう.以下のように結果を表示するものとし,グラフを表示する部分をモジュールとして独立させましょう.
Number of head: 0 1 2 3 4 5 6 7 8 9 10 Frequency: 0 0 7 12 24 23 19 11 4 0 0 Histogram of head frequency of flipped 10 coins 0 10 20 30 40 ------------------------------------------- 0| 1| 2|******* 3|************ 4|************************ 5|*********************** 6|******************* 7|*********** 8|**** 9| 10| |
本体解答例
モジュール解答例