Python

Numpyによる乱数生成

By 2021年6月20日No Comments

この記事ではNumpyの乱数生成に用いるrandom関数について解説します。

乱数はゲーム開発や機械学習、ブロックチェーンといった幅広い分野において欠かせない存在です。この機会に基本的な乱数の作り方を学習しましょう。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト

Numpyのrandomで様々な種類の乱数配列を生成する

標準ライブラリのrandomモジュールを使ってランダムな数値を要素とするリストを生成することができますが、今回はNumpyのモジュールを使って乱数を生成します。Numpyのほうが大きな配列に対しての処理が高速であり、また、今回紹介する一様分布と正規分布以外にも二項分布やガンマ分布といった様々な分布関数が用意されています。

numpy.randomモジュールに、乱数の関数が入っています。そのため、まずはNumpyをインポートすることからプログラムを始めます。

import numpy as np

一様乱数を出力する

一様乱数とは、ある区間において数値が同じ確率で出現する確率分布に従う乱数です。例えば、理想的なサイコロは1から6までの数値が1/6の確率で出現し、一様乱数であるといえます。

np.random.rand()は0.0以上1.0未満の一様乱数を返します。

random_num = np.random.rand()  # 引数に何も入れないと一つの乱数を生成します。
print(random_num)
# 0.8932602498159817

array = np.random.rand(5)  # 要素数が5の配列の乱数を生成します。
print(array)
# [0.42818143 0.71332385 0.42831411 0.66344566 0.89942117]

array = np.random.rand(2, 3)  # 2行3列の配列の乱数を生成します。
print(array)
# [[0.81941817 0.79291766 0.75626265]
#  [0.44016104 0.21345971 0.81012105]]

np.random.rand()によってできる乱数が一様分布しているかを、大量に乱数を生成してヒストグラムで確認してみましょう。

import matplotlib.pyplot as plt

array = np.random.rand(10000)# 一様分布で乱数を10000個生成
plt.hist(array, bins=100)   # 100本のヒストグラムを作成
plt.show()              # グラフを表示

多少ばらつきがありますが一様分布していることがわかりました。

np.random.rand()の他にも、

np.random.random_sample()

np.random.random()といった関数でも0.0以上1.0未満の一様乱数を生成できます。

任意の整数の範囲の乱数を生成するにはnp.random.randint()を使います。引数には(最小値、最大値、要素数)を渡します。

array = np.random.randint(10, 20, 10)  # 最小値10, 最大値20, 要素数10の一様乱数を返します。
print(array)
# [19 16 11 14 11 12 11 19 12 16]

array = np.random.randint(10, 20, (4, 4))  # 4行4列の乱数配列を返します。
print(array)
# [[13 10 15 12]
#  [13 12 19 13]
#  [11 11 10 14]
#  [13 11 13 19]]

正規乱数を出力する

np.random.randn()は平均0、分散1の正規分布に従う乱数を返します。

random_num = np.random.randn()
print(random_num)
# 2.2033257795879453

array = np.random.randn(4, 4)  # 4行4列の正規乱数を生成します。
print(array)
# [[-0.33118327  0.14109154 -0.60173733  0.0629508 ]
#  [ 1.0170575  -1.53912745 -1.29458508 -1.30072127]
#  [ 1.1355995  -0.90102557  0.13478908  0.78014147]
#  [ 0.01500231 -1.14992405 -0.99150823 -0.33801815]]

任意の平均値、標準偏差をもつ乱数の生成にはnp.random.normal()を用います。引数には(平均、標準偏差、要素数)を渡します。

random_num = np.random.normal()  # 引数を渡さないと、平均0、標準偏差1、要素数1の正規乱数を返します。
print(random_num)
# -0.6572619642028156

array = np.random.normal(10, 10, (3, 3))  # 平均値10、標準偏差10、3行3列の正規乱数を返します。
print(array)
# [[11.28529284 26.56984032 31.75544493]
#  [16.33612937 18.2442487  18.85923503]
#  [ 1.0347969  13.97005334 12.37132967]]

乱数のシードを設定する

np.random.seed()を使うことで、発生する乱数を確定させることができます。乱数を用いる分析において再現性が必要な場合に用いられます。

まず、0から20までの範囲で乱数を10個生成します。

array = np.ranodm.randint(0, 20, 10)
print(array)
# [[11.28529284 26.56984032 31.75544493]
#  [16.33612937 18.2442487  18.85923503]
#  [ 1.0347969  13.97005334 12.37132967]]

上のコードにnp.random.seed()を追加させることで、発生する乱数を固定化させることができます。

np.random.seed(0)
array = np.ranodm.randint(0, 20, 10)
print(array)
# [[11.28529284 26.56984032 31.75544493]
#  [16.33612937 18.2442487  18.85923503]
#  [ 1.0347969  13.97005334 12.37132967]]

まとめ

今回はNumpyを用いた乱数生成の方法を解説しました。Numpyライブラリの関数を使用すると高速かつ様々な分布の乱数を生成できます。ぜひ使ってみてください。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト
HOSL

Author HOSL

More posts by HOSL