Generators.random
は、NumPyのrandomモジュールで連続一様分布の乱数配列を生成するためのジェネレータメソッドです。
これと同じ操作は、NumPyのversion1.17までは random.random_sample関数などで行っていました。しかし現在では、default_rng で作成したインスタンス(「ジェネレータオブジェクト」とも言う)に対して、integers メソッドを呼び出すことで行うようになりました。
なお、default_rng については、『numpy.random.default_rng – 乱数生成のためのジェネレータオブジェクトの作成』で解説しているので確認しておいて下さい。
このページでは、このGenerators.random
の使い方を解説します。こちらの方が従来の関数を使った乱数生成よりも大幅に高速で、大量のデータを扱う科学技術計算に適していますので、ぜひ抑えておきましょう。
1. 書式
書き方:
Generator.random(size=None, dtype=np.float64, out=None)
パラメーター:
size: int or tuple of ints, optional 出力する配列のshapeを指定する。デフォルト値のNoneでは、1つの乱数を返す。 |
dtype: dtype, optional 出力する配列の要素の型を指定する。float64とfloat32のみ指定可能。デフォルト値はnp.float64 |
out: ndarray, optional 戻り値を出力する場所を指定する。sizeがNoneでない場合は、戻り値のshapeと、出力先の配列のshapeが合致している必要がある。 |
戻り値:
out: float or ndarray 要素が浮動小数点(float型)で任意のshapeの配列。sizeを渡していない場合は、浮動小数点のランダムな数値。 |
連続一様分布とは
繰り返しになりますが、Generators.integersは連続一様分布から乱数を取得するメソッドです。それでは、連続一様分布とは何でしょうか。連続一様分布とは、以下のヒストグラムのように、範囲内の全ての数値が一様に等しく出現するようになっている分布のことです。
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng()
r = rng.random(100000)
plt.hist(r)
plt.xlabel('x')
plt.ylabel('frequency')
plt.show()
このようにGenerator.randomの連続一様分布では、0.0以上1.0未満の全ての数値が等しい確率で取得されます。
2. サンプルコード
ジェネレータメソッドは、すべて default_rng で作成したインスタンスに対して使用します。インスタンスの作成は、以下のコードのように、任意の変数にdefault_rng を代入することで行います。
import numpy as np
rng = np.random.default_rng()
rng
これで、ジェネレータオブジェクトの rng が作成されました。さて、ここから連続一様分布から0.0以上1.0未満の浮動小数点数の乱数を取得するには、このジェネレータオブジェクト rng に対して random メソッドを使います。
引数を指定しない場合は、0.0以上1.0未満の連続一様分布の中から、浮動小数点(float型)の乱数を1つ返します。
rng.random()
size: 形状の指定
引数で出力する配列のshapeを指定します。shapeは『NumPyのshape属性 – 配列の形状の確認と変更』で解説しています。
# 1次元配列
rng.random(2)
2次元配列以上の場合は、shapeをタプルで渡します。タプルについては『Pythonのタプルの基本的操作のまとめ』で解説しています。
# 2次元配列
rng.random((2, 3))
dtypeの指定
オプション引数のdtypeでは、出力する配列の要素の型をfloat32かfloat64に指定することができます。要素の型については、『NumPyのdtype属性の一覧と参照・指定・変更方法』で確認しておくと良いでしょう。
outの指定
オプション引数のoutでは、指定した既存の配列を出力結果の配列で上書きすることができます。これを実行する時は、出力する配列のshapeと上書きする配列のshapeが一致している必要があります。
任意のa以上b未満の範囲の連続一様分布から乱数を生成する
Generators.randomで得られる乱数の範囲は、0.0以上1.0未満と決まっています。しかし時には数値の範囲を広めたい時もあるでしょう。
その場合は、次のように書くことで任意のa以上b未満の範囲から連続一様分布の乱数を生成することができます。
(b-a) * gen.random(...) + a
例として5以上10未満の連続一様分布から乱数を生成してみましょう。
# [5, 10) の連続一様分布から乱数を生成
5 * rng.random((2, 3)) + 5
ただし、任意の範囲の連続一様分布からの乱数生成には、Generator.uniformを使う方が便利です。
3. まとめ
以上が Generators.random の使い方です。これまでは同じ操作をするのに以下の3つの関数が使われてきました。
しかし、これからはこの Generators.random を使うようにしていきましょう。
コメント