numpy.random.randintは、離散一様分布の整数の乱数配列を生成することができる関数です。実際のコードを見ながら使い方を確認していきましょう。
重要
NumPyのversion1.17以降は、乱数を生成する際には関数は使わずに、ジェネレータメソッドを使うようになりました。そのため、現在はrondom.randint関数ではなく、Generator.integersメソッドを使います。こちらの方が圧倒的に処理速度が早く、NumPyを使った科学技術計算に適しています。『Generator.integers – 離散一様分布の整数の乱数配列を生成』でご確認ください。
1. 書式
まずは、numpy.random.randintの書き方を確認しましょう。
書き方:
np.random.randint(low, high=None, size=None)
パラメーター:
low: int highを指定している場合は、ここで指定した数値が最小の値になる。highを指定していない場合は、ここで指定した数値-1が最大値になる。 |
high: int, optional ここで指定した数値-1が最大値になる。デフォルトはNone。 |
size: int or tuple of ints 出力される配列のshapeを指定する。デフォルトはNone。 |
戻り値:
int of ndarray of ints: 整数(int型)の乱数を要素とした指定のshapeの配列。サイズが指定されていない場合はランダムな1つの数値。 |
一緒に確認したい関数:
- Generator.integers: 離散一様分布の整数の乱数配列を生成するメソッド。新しいコードではrandom.randintではなく、こちらを使うこと。
- random.rand: 0以上1未満の範囲で連続一様分布の乱数配列を生成
離散一様分布とは
繰り返しになりますが、numpy.random.randintは、指定の数値の範囲の離散一様分布から、整数の乱数を生成します。離散一様分布とは、確率分布の一種です。単純な例としてサイコロがよく挙げられます。1回サイコロを振った場合、とりうる値は 1, 2, 3, 4, 5, 6 で、それぞれの値が出る確率は1/6で均等です。
以下は、離散一様分布を示したものです。
つまり、離散一様分布では指定の範囲の数値のうち、すべての整数が等しい確率で得られるということです。
2. サンプルコード
それでは、実際のコードで使い方を確認しましょう。
最小値lowと最大値high
まず、第一引数のみを渡すと、0以上、指定の数値-1以下の範囲から、数値を1つランダムで返します。
import numpy as np
# 指定の数値より小さな数値をランダムに戻す。
np.random.randint(7)
第一引数と第二引数で、数値の範囲を指定することができます。生成される乱数に最小値は含まれますが、最大値は含まれません(これをhalf-closed intervalと言います)。
# 指定の範囲の数値をランダムに戻す。
np.random.randint(1, 7)
負の数値を指定することも可能です。
# 負の数値も可能
np.random.randint(-10, -1)
size(形状)
第三引数では、生成する配列のshapeをタプルで渡します。shapeについては『NumPyのshape属性 – 配列の形状の確認と変更』で解説しています。
# size引数で配列のshapeをタプルで指定
np.random.randint(0, 10, (3,))
もちろん、N次元配列も指定可能です。
# 2次元配列を指定
np.random.randint(-10, 0, (2, 3))
# 3次元配列を指定
np.random.randint(0, 6, (2, 2, 3))
応用テクニック
次のように書けば、それぞれの要素ごとに異なる最大値や最小値を指定することも可能です。
# 1×3 の配列でそれぞれの要素に異なる最大値を指定
np.random.randint(1, [3, 5, 10])
# 1×3 の配列でそれぞれの要素に異なる最小値を指定
np.random.randint([1, 5, 7], 10)
複数の最小値と複数の最大値を指定することも可能です。
# 2×4 の配列でそれぞれの要素に異なる最小値・最大値を指定
np.random.randint([1, 3, 5, 7], [[10], [20]])
解説しておくと、上のコードではブロードキャストが適用されて、最小値と最大値が、各行列ごとに以下のように指定されています。
3. まとめ
以上が、numpy.random.randintです。しかし、現在は、この関数は使わずに、Generatot.integersメソッドを使います。こちらの方が遥かに高速です。今後、新しい乱数を生成する際は、こちらを使うようにしましょう。詳しくは、『Generator.integers – 離散一様分布の整数の乱数配列を生成』で解説しています。
コメント