こんにちは!インストラクターのフクロウです!
ある区間内からランダムに整数を取り出す関数、np.random,randintについてこの記事では紹介します。
NumPyに実装された乱数に関係する機能はたくさんありますが、この関数がもしかしたら一番わかり易いのでは無いでしょうか。
この記事で二つのrandintについてマスターして、乱数を使いこなすための第一歩を踏み出しましょう!
randintの使い方
np.random.randintは「全ての面で出る確率が等しいサイコロ」を投げたときの動作をします。
ただし、randintで作れるサイコロは6面だけでなく、どんな範囲を指定することも可能です。
基本的な使い方
randint関数は第一引数に最小値、第二引数に最大値を指定して使います。第一引数以上、第二引数以下の整数を返します。
実際に使って確かめてみましょう。実行するごとに結果が変わります。
import numpy as np import matplotlib.pyplot as plt # 1~6の範囲のサイコロ np.random.randint(1,7) # 結果 6 # -10~10の範囲のサイコロ np.random.randint(-10,11) # 結果 -9
このサンプルでは最初に1<= N <=7で乱数を生成し、次に-10<= N <=11で乱数を生成しています。
試行回数が複数回の場合
randintを使って生成できるのは「サイコロを一回投げた結果」だけではありません。
返り値の配列の形状を第三引数として指定できます。
# サイコロを五回投げたときの結果 np.random.randint(1,7,5) # 結果 array([2, 1, 6, 2, 6]) # もちろん多次元配列を生成することも可能 np.random.randint(1,7,(3,4)) # 結果 array([[4, 6, 3, 1], [1, 5, 6, 6], [3, 3, 4, 4]])
本当にそれぞれの面の出る確率は等しいのか
蛇足になりますが、それぞれの面の出る確率が本当に等しくなるのか、実験で確認してみましょう。
# 実験: a = np.random.randint(1,7,1000000) tmp=[] for i in range(1,7): tmp.append(list(a).count(i)) plt.bar([1,2,3,4,5,6],tmp)
それぞれの出目はほぼ同じ回数でていることがわかりますね。
さて、ここで考えてしまうのが、「それぞれの面のでる確率が等しくない、いびつなサイコロはどうやって作れば良いんだろう」というものです。
このいびつなサイコロを実現するには、多項分布というものを使う必要があります。
これの話はまた別の記事とさせていただきますが、このような色んな条件から乱数を生成する方法がまだまだ沢山np.randomモジュールの中には収められています。
まとめ
この記事では、np.random.randintを使ったサイコロのような機能の使い方を紹介しました。
randintを始めとして、これ以外にも様々な乱数を生成する機能がnp.randomモジュールには収められています。
機械学習では確率的な操作が不可欠なので、きっとnp.randomモジュールの中の機能たちが役に立つことでしょう。
是非それらの使い方を勉強して、機械学習の実装に役立ててください!