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

numpy.random.random_sampleは、0.0以上1.0未満の範囲(half-closed interval)で、連続一様分布の不動小数点(float型)の乱数を返す関数です。なお、コードを工夫すれば、a以上b未満の乱数を得ることも可能です。この方法についても解説します。

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

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

目次

1. 書式

numpy.random.random_sample

書き方:

np.random.random_sample(size=None)

パラメーター:

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

戻り値: 

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

一緒に確認したい関数:

  • Generator.random: 0以上1未満の範囲で小数の乱数配列を生成(連続一様分布)。新しいコードではrandom_sampleではなく、こちらを使う。
  • numpy.random.random: 0以上1未満の範囲の連続一様分布の乱数配列を生成(random_sampleのエイリアス)
  • random.rand: 0以上1未満の範囲の連続一様分布の乱数配列を生成

連続一様分布とは

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

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

つまり、0.0以上1.0未満のすべての値が等しい頻度で生成されるということです。

2. サンプルコード

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

まず、引数に何も渡さなかった場合は、0.0以上1.0未満のランダムな浮動小数点を1つ返します。

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

引数に、配列のshapeをタプルで渡すと、指定のshapeの配列を生成します。なおshapeについては『NumPyのshape属性 – 配列の形状の確認と変更』で解説しています。

In [2]:
#  1次元配列を生成
np.random.random_sample((3, ))
Out[2]:
array([0.70890032, 0.95107761, 0.26393041])
In [3]:
# 2次元配列
np.random.random_sample((2, 3))
Out[3]:
array([[0.31521695, 0.58084354, 0.95897389],
       [0.12440411, 0.06440809, 0.84618103]])

小ネタ

小ネタですが、shape(0)を指定するとデータ型が浮動小数点の空の配列を精製します。データ型については『NumPyのdtype属性の一覧と参照・指定・変更方法』で解説しています。

In [4]:
#  0を渡すと空の配列を生成
np.random.random_sample((0))
Out[4]:
array([], dtype=float64)

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

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

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

(b-a)*random_sample()+a 

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

In [5]:
# [5, 10) のランダムな数値の配列を生成
5 * np.random.random_sample((3, 2)) + 5
Out[5]:
array([[5.02637799, 5.00306014],
       [6.83669307, 5.95823457],
       [6.55610801, 8.26006991]])

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

次のように書きます。

In [6]:
# [-5, 0) のランダムな数値の配列を生成
5 * np.random.random_sample((3, 2)) - 5
Out[6]:
array([[-4.98127538, -3.9593848 ],
       [-0.80998307, -4.40103864],
       [-0.81488156, -2.26633937]])

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

3. まとめ

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

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

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

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

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



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる