乱数の発生をこれまで何度も行ってきましたが,モジュール名が長いし,関数名も文字数が多いので,それをそれぞれ2文字に短縮してみましょう.3桁の正の整数を乱数を用いて発生させる簡単なプログラムでモジュール名を2文字にするものと,別名で関数を2文字にするものをそれぞれ作ってみましょう.
A random number with 3 digits: 166 |
2桁の正の整数を20個発生させ,その平均値,中央値,また,不偏分散と標本標準偏差を求めますが,Python にあらかじめ組み込まれているモジュールの関数を使用してみましょう.どのようなモジュールがあるのかを検索してみてください.また,呼び出し時にはなるべく簡単になるよう,import 文も工夫しましょう.
Random numbers with 2 digits: 70 48 56 43 70 30 65 79 81 71 31 74 72 21 32 98 96 53 90 75 Mean: 62.8 Median: 70.0 Variance: 512.9 Standard deviation: 22.6 |
一様分布な乱数を発生させる randint 関数ですが,一様分布な乱数の平均値を何度か求めていくと,平均値の平均値は正規分布に従う値になります.(中心極限定理)
10個の2桁の正の整数を発生させることを10回行って,5回目以降乱数が増えるたびに平均値の標準偏差の値が落ち着いていくかどうかを観察するプログラムを作成しましょう.
1: 59 93 20 90 93 75 56 66 71 12 63.5 2: 54 27 32 87 81 10 43 60 71 60 52.5 3: 27 21 28 58 44 70 61 58 82 77 52.6 4: 63 74 80 24 97 86 92 81 67 47 71.1 5: 28 46 98 42 11 49 50 40 81 36 48.1 57.6 6: 51 74 93 57 87 74 32 19 98 15 60.0 58.0 7: 79 78 47 89 51 29 53 81 33 57 59.7 58.2 8: 57 56 95 64 42 45 88 49 97 20 61.3 58.6 9: 44 27 34 93 58 56 83 57 44 22 51.8 57.8 10: 44 56 15 78 45 11 26 88 16 75 45.4 56.6 |
授業中に追加で説明を行った標準偏差も計算するバージョンは,下のような結果表示をするものでした.
1: 52 57 77 17 91 17 27 20 98 89 54.5 2: 96 24 25 98 81 63 24 11 20 47 48.9 3.96 3: 95 48 80 33 41 90 72 72 67 80 67.8 9.71 4: 59 33 89 54 48 46 73 81 79 80 64.2 8.69 5: 91 41 14 74 60 90 29 10 26 74 50.9 8.32 57.3 6: 26 78 55 56 72 12 44 53 67 65 52.8 7.67 56.5 0.53 7: 11 20 23 27 86 36 79 93 91 80 54.6 7.03 56.2 0.53 8: 43 25 91 70 82 42 15 28 49 97 54.2 6.55 56.0 0.55 9: 78 83 56 96 25 25 45 44 41 77 57.0 6.14 56.1 0.51 10: 88 22 72 15 59 23 45 78 22 66 49.0 6.21 55.4 0.62 |
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| |