numpy.random.uniform – 任意の範囲の連続一様分布の乱数を生成

numpy.random.uniformは、任意の範囲の連続一様分布から浮動小数点数の乱数を生成する関数です。この関数の使い方について解説していきます。

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

目次

1. 書式

numpy.random.uniform

書き方:

np.random.uniform(low=0.0, high=1.0, size=None)

パラメーター:

low: float or array_like of floats, optional
乱数の最小値を指定。生成される乱数は、全てこの最小値以上の数値になる(最小値含む)。デフォルト値は0。
high: float or array_like of floats
乱数の最大値を指定。生成される乱数は、全てこの最大値より小さな数値になる(最大値含まない)。デフォルト値は1.0。
size: int or tuple of ints, optional
出力する配列のshapeを指定する。デフォルト値のNoneの場合は出力はスカラーになる。それ以外では、np.broadcast(low, high).sizeの乱数が生成される。

戻り値: 

out: ndarray or scalar
指定した範囲の連続一様分布からの乱数を出力する。

一緒に確認したい関数:

  • Generator.uniform: ジェネレータメソッド。今後はrandom.uniformではなく、こちらを使うこと。
  • randint: 離散一様分布の整数の乱数配列を生成
  • random_sample: 0以上1未満の範囲の連続一様分布の乱数配列を生成
  • random: 0以上1未満の範囲の連続一様分布の乱数配列を生成
  • rand: 0以上1未満の範囲の連続一様分布の乱数配列を生成

連続一様分布について

random.uniform関数の確率密度関数は、[low:a, high:b) としたら、以下の式で表すことができます。

指定の範囲内の数値が、すべて同じ確率で生成されるため、この関数は連続一様分布です。

なお、high == low の時は、low の数値が返ります。high < low の時はエラーになります。細かいですが、浮動小数点数の丸めによっては、乱数の中にhighの値が含まれる場合もあります。たとえば、次のような場合です。

In [1]:
x = np.float32(5*0.999999999999)
x
Out[1]:
5.0

2. サンプルコード

それでは、numpy.random.uniformのサンプルコードを見ていきましょう。

low と high だけを指定した場合は、指定の範囲の浮動小数点数(float型)の数値を1つ返します。

In [1]:
import numpy as np
np.random.uniform(0, 5)
Out[1]:
4.217690743073998

第三引数で配列のsizeを指定します。

In [2]:
np.random.uniform(0, 5, 10)
Out[2]:
array([2.19056613, 3.04155145, 1.41122328, 4.48356978, 3.39299517,
       2.32264344, 2.35022275, 3.84570603, 2.23419184, 3.82381463])

多次元配列のshapeを指定する場合はタプルで渡します。なお、配列のshapeについては『NumPyのshape属性 – 配列の形状の確認と変更』で解説しています。

In [3]:
np.random.uniform(0, 5, (5, 2))
Out[3]:
array([[4.20791688, 4.94317208],
       [2.85129915, 0.70674652],
       [4.85241038, 1.90243218],
       [3.28722336, 3.71582156],
       [2.65091646, 3.86139781]])

次のようにヒストグラムにしてみると、指定の範囲の数値がすべて同じ確率(連続一様分布)で生成されていることがわかります。

In [4]:
import matplotlib.pyplot as plt

s = np.random.uniform(-1, 0, 10000)

count, bins, ignored = plt.hist(s, 15, density=True)
plt.plot(bins, np.ones_like(bins), linewidth=2, color='r')
plt.show()

3. まとめ

以上が、numpy.random.uniform関数です。しかし、現在は、この関数は使わずに、Generatot.uniformメソッドを使います。こちらの方が遥かに高速です。今後、新しい乱数を生成する際は、こちらを使うようにしましょう。詳しくは、『Generator.uniform – 連続一様分布から任意の範囲の乱数を生成』で解説しています。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる