【Numpy入門 np.random.randint】いろんなサイコロが作れるrandint

こんにちは!インストラクターのフクロウです!

ある区間内からランダムに整数を取り出す関数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モジュールの中の機能たちが役に立つことでしょう。

是非それらの使い方を勉強して、機械学習の実装に役立ててください!

この記事を書いた人

第一言語はPythonです。
皆さんRustやりましょう。

目次