numpy.random.randは、0.0以上1.0未満の範囲で連続一様分布のランダムな浮動小数点(float型)の配列を生成する関数です。コードを工夫すれば、a以上b未満の乱数を得ることも可能です。この方法についても解説します。
なお、全く同じ働きをする関数にrandom.random_sampleがあります。random.randは、Matlabからコードをポーティングしてくるユーザー用に、random.random_sampleをより簡単にしたものです。
両者の違いは、random.random_sampleは、zerosやonesなどの他のNumPy関数と同じようにshapeをタプルで渡しますが、random.randはshapeを数値で渡す点にあります。
それでは見ていきましょう。
重要
NumPyのversion1.17以降は、乱数の生成には関数ではなくジェネレータメソッドを使うようになりました。そのため、現在はrandは使わず、Generator.randomメソッドを使うのが推奨されています。こちらの方が圧倒的に処理速度が速く、科学技術計算に適しています。『Generators.random – 連続一様分布から0.0以上1.0未満の乱数配列を生成』でご確認ください。
1. 書式
書き方:
np.random.rand(d0, d1, ..., dn)
パラメーター:
d0, d1, …, dn: int 配列の次元数を数値で指定します。負の整数を指定することはできません。 |
戻り値:
ndarray, shape(d0, d1, …, dn): 指定のshapeで、要素が0.0以上1.0未満のランダムな浮動小数点(float型)の配列。引数を指定しない場合は、ランダムな1つの浮動小数点。 |
一緒に確認したい関数:
- random: 0以上1未満の範囲の連続一様分布の乱数配列を生成
- random.random_sample: 0以上1未満の範囲の連続一様分布の乱数配列を生成
連続一様分布とは
numpy.random.randは、0.0以上1.0未満の範囲から、小数の値をランダムに返します。戻り値の数値は一様分布から得られます。具体的には、以下のヒストグラムのように、全ての値が一様に等しく出現するようになっています。
import numpy as np
import matplotlib.pyplot as plt
rand1 = np.random.rand(1000000)
plt.hist(rand1)
plt.xlabel('x')
plt.ylabel('frequency')
plt.show()
つまり、0.0以上1.0未満の数字がすべて等しい頻度で生成されるということです。
2. サンプルコード
それでは、実際のコードで使い方を確認しましょう。
まず、引数を指定しない場合はランダムな小数を1つ返します。
import numpy as np
# 引数を指定しない場合は0.0以上1.0未満のランダムな小数を返す。
np.random.rand()
引数ではshapeを指定します。以下では1次元配列を生成しています。なおshapeについては『NumPyのshape属性 – 配列の形状の確認と変更』で解説しています。
# 引数でshapeを指定する。
np.random.rand(3)
もちろん、N次元配列も指定可能です。
# 2次元配列
np.random.rand(2, 3)
# 3次元配列
np.random.rand(2, 2, 3)
任意のa以上b未満の範囲の連続一様分布から乱数を生成する
さて、この関数で得られる数値の範囲は、0.0以上1.0未満のhalf-intervalと決まっています。しかし時には数値の範囲を広めたい時もあるでしょう。
そんな時は、以下の式を使います。
(b-a)*np.random.rand()+a
例えば、5.0以上10.0未満でランダムな数値を得たい場合は、次のように書きます。
# [5, 10) のランダムな数値の配列を生成
5 * np.random.rand(3, 2) + 5
それでは、-5.0以上0未満で数値を得たい場合は、どうすれば良いでしょうか?次のように書きます。
# [-5, 0) のランダムな数値の配列を生成
5 * np.random.rand(3, 2) - 5
ただし、任意の範囲の連続一様分布からの乱数の生成には、numpy.random.uniform関数の方が便利です。『numpy.random.uniform – 任意の範囲の連続一様分布の乱数を生成』で解説しています。
3. まとめ
以上が、numpy.random.randです。なお、randomモジュールで0.0以上1未満の連続一様分布の乱数を生成する関数は、randも含めて3つあります。
それぞれの違いを下表で簡潔に示します。
Table: 0.0以上1未満の連続一様分布の乱数を生成する関数
関数 | 引数 | 備考 |
---|---|---|
random_sample | タプル | – |
random | タプル | random_sampleのエイリアス |
rand | 数値 | Matlabユーザー用に簡便化したもの |
※現在は Generator.random メソッドの使用が推奨 |
今後は、0.0以上1未満の連続一様分布の乱数を生成する際は、これらの関数ではなく、Generator.randomメソッドを使うようにしましょう。
コメント