numpy.random.rand – 連続一様分布から0以上1未満の乱数配列を生成

numpy.random.randは、0.0以上1.0未満の範囲で連続一様分布のランダムな浮動小数点(float型)の配列を生成する関数です。コードを工夫すれば、a以上b未満の乱数を得ることも可能です。この方法についても解説します。

なお、全く同じ働きをする関数にrandom.random_sampleがあります。random.randは、Matlabからコードをポーティングしてくるユーザー用に、random.random_sampleをより簡単にしたものです。

両者の違いは、random.random_sampleは、zerosonesなどの他のNumPy関数と同じようにshapeをタプルで渡しますが、random.randはshapeを数値で渡す点にあります。

それでは見ていきましょう。

重要
NumPyのversion1.17以降は、乱数の生成には関数ではなくジェネレータメソッドを使うようになりました。そのため、現在はrandは使わず、Generator.randomメソッドを使うのが推奨されています。こちらの方が圧倒的に処理速度が速く、科学技術計算に適しています。『Generators.random – 連続一様分布から0.0以上1.0未満の乱数配列を生成』でご確認ください。

目次

1. 書式

numpy.random.rand

書き方:

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未満の範囲から、小数の値をランダムに返します。戻り値の数値は一様分布から得られます。具体的には、以下のヒストグラムのように、全ての値が一様に等しく出現するようになっています。

In [1]:
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つ返します。

In [1]:
import numpy as np
# 引数を指定しない場合は0.0以上1.0未満のランダムな小数を返す。
np.random.rand()
Out[1]:
0.09212298466751212

引数ではshapeを指定します。以下では1次元配列を生成しています。なおshapeについては『NumPyのshape属性 – 配列の形状の確認と変更』で解説しています。

In [2]:
# 引数でshapeを指定する。
np.random.rand(3)
Out[2]:
array([0.1221972 , 0.63610429, 0.35243689])

もちろん、N次元配列も指定可能です。

In [4]:
# 2次元配列
np.random.rand(2, 3)
Out[4]:
array([[[0.77496537, 0.78449402, 0.71046125],
        [0.21549178, 0.16541726, 0.07017509]],

       [[0.93771544, 0.93979029, 0.09972771],
        [0.41611439, 0.43298735, 0.53422116]]])
In [5]:
# 3次元配列
np.random.rand(2, 2, 3)
Out[5]:
array([[[0.87019206, 0.89408065, 0.6382761 ],
        [0.39954678, 0.48159405, 0.52799222]],

       [[0.40564336, 0.13449706, 0.27114458],
        [0.49970211, 0.5171633 , 0.70720616]]])

任意のa以上b未満の範囲の連続一様分布から乱数を生成する

さて、この関数で得られる数値の範囲は、0.0以上1.0未満のhalf-intervalと決まっています。しかし時には数値の範囲を広めたい時もあるでしょう。

そんな時は、以下の式を使います。

(b-a)*np.random.rand()+a 

例えば、5.0以上10.0未満でランダムな数値を得たい場合は、次のように書きます。

In [6]:
# [5, 10) のランダムな数値の配列を生成
5 * np.random.rand(3, 2) + 5
Out[6]:
array([[8.65525955, 8.05028951],
       [7.67750728, 6.49283407],
       [6.54025981, 7.60950978]])

それでは、-5.0以上0未満で数値を得たい場合は、どうすれば良いでしょうか?次のように書きます。

In [7]:
# [-5, 0) のランダムな数値の配列を生成
5 * np.random.rand(3, 2) - 5
Out[7]:
array([[-3.53815546, -4.59491959],
       [-2.9729799 , -2.82640897],
       [-4.56821204, -1.88071876]])

ただし、任意の範囲の連続一様分布からの乱数の生成には、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メソッドを使うようにしましょう。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる