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

numpy.random.randomは、0以上1未満の範囲(half-closed interval)で、連続一様分布のランダムな不動小数点を返す関数です。後述しますが、a以上b未満のランダムな浮動小数点を得ることも可能です。

なお、この関数は、新しいrandom APIに対するフォワードポーティングを簡便化するためのrandom.random_sample関数のエイリアス(名前が違うだけで全く同じ関数)です。そのため、使い方はrandom_sampleと同じです。

それでは、実際のコードを見ながら使い方を確認していきましょう。

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

目次

1. 書式

numpy.random.random

書き方:

np.random.random(size=None)

パラメーター:

size: int or tuple of ints, optional
配列のshapeをタプル型で指定します。デフォルト値はNoneです。

戻り値: 

float or ndarray of floats:
指定のshapeで、0以上1未満の浮動小数点(float型)の乱数配列を返します。sizeを指定しない場合はランダムな浮動小数点を1つ返します。

一緒に確認したい関数:

  • random.rand: 0以上1未満の範囲で小数の乱数配列を生成(連続一様分布)
  • random.random_sample: 0以上1未満の範囲で小数の乱数配列を生成(連続一様分布)
  • Generator.random: 0以上1未満の範囲で小数の乱数配列を生成(連続一様分布)

連続一様分布とは

numpy.random.randomは、0.0以上1.0未満の範囲(half-closed interval)から、小数の値をランダムに返します。戻り値の数値は連続一様分布から得られます。連続一様分布とは、以下のヒストグラムのように、全ての値が一様に等しく出現するようになっている分布のことです。

In [1]:
import matplotlib.pyplot as plt
rand1 = np.random.random(1000000)
plt.hist(rand1)
plt.xlabel('x')
plt.ylabel('frequency')
plt.show()

2. サンプルコード

それでは、実際のコードで使い方を確認しましょう。

引数に何も渡さない場合は、ランダムな小数を返します。

In [1]:
import numpy as np
np.random.random()
Out[1]:
0.6112720017297618

次のように引数を渡すと1次元配列を生成します。

In [2]:
# 1次元配列を生成
np.random.random((2,))
Out[2]:
array([0.93558831, 0.56269375])

N次元配列を生成する時は、任意のshapeをタプルで渡します。numpy.random.randはタプルではなく、数値を渡しますが、numpy.random.randomはタプルを渡すという点に違いがあります。

In [3]:
# 2次元配列を生成
np.random.random((2, 3))
Out[3]:
array([[0.85826009, 0.15920656, 0.42338804],
       [0.49423485, 0.33814074, 0.0405109 ]])

任意のa以上b未満の範囲の乱数を生成する

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

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

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

例えば、5以上10未満のランダムな連続一様分布からの数値を得たい場合は次のように書きます。

In [4]:
# [5, 10) のランダムな数値の配列を生成
5 * np.random.random((3, 2)) + 5
Out[4]:
array([[9.59434137, 6.85394129],
       [7.86314779, 5.46399743],
       [7.89923393, 5.95972415]])

それでは、-5以上0未満のランダムな数値をもつ配列を生成するにはどうすれば良いでしょうか?

次のように書きます。

In [5]:
# [-5, 0) のランダムな数値の配列を生成
5 * np.random.random((3, 2)) - 5
Out[5]:
array([[-4.88798427, -0.71016277],
       [-2.4996346 , -4.85047986],
       [-3.68940873, -2.09393324]])

ただし、任意の範囲の連続一様分布からの乱数の生成には、numpy.random.uniform関数の方が便利です。『numpy.random.uniform – 任意の範囲の連続一様分布の乱数を生成』で解説しています。

3. まとめ

以上が、numpy.random.randomです。なお、randomモジュールで0.0以上1未満の連続一様分布の乱数を生成する関数は、randomも含めて3つあります。

それぞれの違いを下表で簡潔に示します。

Table: 0.0以上1未満の連続一様分布の乱数を生成する関数

関数 引数 備考
random_sample タプル
random タプル random_sampleのエイリアス
rand 数値 Matlabユーザー用に簡便化したもの
現在は Generator.random メソッドの使用が推奨

今後は、0.0以上1未満の連続一様分布の乱数を生成する際は、これらの関数ではなく、Generator.randomメソッドを使うようにしましょう。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる