目的
機械学習やビッグデータの解析では,乱数(random numers)を使用することがある.ここでは,numpyモジュールを使用して,いくつかの種類の乱数を生成する方法を学ぶ.
説明
一様乱数の生成
0から1の間の一様乱数を生成する
numpyモジュールを使用して乱数を生成する方法はいくつかあるが,ここでは乱数生成器から乱数を生成する方法を説明する.乱数生成器を作り,乱数を生成するには以下のように記述すればよい.
1行目でnumpy.randomモジュールからdefault_rngをインポートし,5行目で乱数生成器を作り,rgという名前をつけている.乱数生成器にはいくつか種類があり,numpyではそれらを指定できるが,ここではデフォルトの乱数生成器(default random number generator)を作っている.7行目で乱数生成器のrandomメソッドを使用して1つの乱数を,8行目で5つの乱数からなる配列を作っている.
このプログラムを実行すると,以下のように表示される.randomメソッドは0から1の間の数を等確率で(一様分布に従って)生成するメソッドであるため,0から1の間の乱数が生成される.
また,このプログラムを何度か実行すると,実行するたびに異なる乱数が生成される.
範囲を指定して一様乱数を生成する
以上の例では,0から1の間の一様乱数を生成した.範囲を指定してその範囲の中から一様乱数を生成するには,以下のようにすればよい.
7行目のように,乱数生成器のuniformメソッドを使用すると,0から1の間の一様乱数を1つ生成することができる.8行目のように20を引数として指定すると,0から20の間の一様乱数を1つ生成できる.9行目のように10と20を引数として指定すると,10から20の間の一様乱数を1つ生成できる.10行目のように10と20と5を引数として指定すると,10から20の間の一様乱数を5つ生成できる.
範囲を指定して整数の一様乱数を生成する
先程の例では,範囲を指定して浮動小数点数の一様乱数を生成した.整数の一様乱数を生成するには,以下のようにすればよい.
7行目のように,乱数生成器のintegersメソッドを20を引数として呼び出すと,0から19の間の整数の一様乱数を1つ生成できる.8行目のように10と20を引数として指定すると,10から19の間の整数の一様乱数を1つ生成できる.9行目のように10と20と5を引数として指定すると,10から19の間の整数の一様乱数を5つ生成できる.
正規分布に従う乱数の生成
平均と標準偏差を指定して正規分布に従う乱数を生成する
例えばテストの点数や身長は一様分布ではなく,正規分布(normal distribution)に従うことが知られている.正規分布に従う乱数を生成するには,以下のようにすればよい.
7行目のように,乱数生成器のnormalメソッドを使用すると,平均0・標準偏差1の正規分布に従う乱数を1つ生成することができる.8行目のように60と20を引数として指定すると,平均60・標準偏差20の正規分布に従う乱数を1つ生成できる.9行目のように60と20と5を引数として指定すると,平均60・標準偏差20の正規分布に従う乱数を5つ生成できる.
標準正規分布に従う乱数を生成する
平均0・標準偏差1の正規分布を標準正規分布(standard normal distribueion)という.標準正規分布に従う乱数を生成するには,以下のようにすればよい.
7行目のように,乱数生成器のstandard_normalメソッドを使用すると,標準正規分布に従う乱数を1つ生成することができる.8行目のように5を引数として指定すると,標準正規分布に従う乱数を5つ生成できる.
ランダム順列の生成
配列の要素をランダムに並べ替える(新しく配列オブジェクトを生成する)
0から9までの数字が記載された10枚のカードをランダムに並べ替えるには,以下のようにすればよい.
8行目のように,乱数生成器のpermutationメソッドを10を引数として指定して呼び出すと,0から9までの整数をランダムに並べ替えた配列を生成できる.また,11行目のように0から9までの整数からなる配列を生成し,12行目のように,それを引数としてpermutationメソッドを呼び出すと,配列の要素をランダムに並べ替えた配列を生成できる.
配列の要素をランダムに並べ替える(配列の内容を変更する)
以下のようにしても,0から9までの数字が記載された10枚のカードをランダムに並べ替えることができる.
8行目で0から9までの整数からなる配列を生成し,10行目のように,それを引数としてshuffleメソッドを呼び出すと,引数で指定した配列の要素がランダムに並べ替えられる.
ランダムシードの指定
コンピュータで生成される乱数は疑似乱数と呼ばれるもので,元となる値(シード)から計算によって生成される.毎回同じ乱数を生成したい場合にはランダムシードを固定すればよい.numpyモジュールの乱数生成器ではランダムシードを指定することができる.
6行目のように,乱数生成器を作る際に,キーワード引数seedでランダムシードの値(0以上の整数値)を指定できる.ランダムシードを0にすると,以下のような乱数が生成され,ランダムシードの値を変えなければ,何度実行しても同じ乱数が生成される.
課題
課題0
サイコロを100回振って出る目からなる配列を作れ.
課題1
10桁の数字からなる宝くじの当選番号をランダム決めるプログラムを作れ.
課題2
13桁の数字からなる宝くじの1等の当選番号1個,2等の当選番号2個,3等の当選番号3個をランダム決めるプログラムを作れ.
課題3
平均点60点・標準偏差10点の英語のテストの点数を表す正規分布から,100人分の英語のテストの点数からなる配列を作れ.
課題4
平均170.3cm・標準偏差5.27cmの20歳男性の身長を表す正規分布から,100人分の身長データからなる配列を作れ.
課題5
1から53までの数字が書かれた53枚のカードをシャッフルした配列を作れ.
課題6
1から53までの数字が書かれた53枚のカードをシャッフルし,4人に5枚ずつ配った.4人が持っているカードを表す配列を作れ.
課題7
1から53までの数字が書かれた53枚のカードをシャッフルし,3人に全て配った.3人が持っているカードを表す配列を作れ.
課題8
平均点67.2点・標準偏差11.3点の国語のテストの点数を表す正規分布から,100人分の英語のテストの点数からなる配列を作れ.その際,毎回結果が変わらないようにせよ.
課題9
1から53までの数字が書かれた53枚のカードをシャッフルし,5人に5枚ずつ配った.5人が持っているカードを表す配列を作れ.その際,毎回結果が変わらないようにせよ.