メインコンテンツへスキップ
  1. 授業・研究ノート/
  2. Python/
  3. NumPy/

乱数

目次
NumPy - この記事は連載の一部です
パート 3: この記事

NumPyの乱数
#

昔は(今でも使えるが)np.random.rand()が使われていたが,現在はnp.random.default_rng()というGeneratorを使うのが主流なのでこちらを使用すると良い.

昔のnp.random.rand()はグローバルな乱数状態を共有するので大規模コードでは不向き.np.random.default_rng()はGeneratorなので乱数生成器を独立に持てる.

インスタンス生成とseed
#

Generatorクラスのインスタンスを生成する.変数名はrngでもrng1でも好きなものでいい.

rng = np.random.default_rng()

再現性が欲しいときは引数にseedを指定する.この場合はなんでも良いが0

rng = np.random.default_rng(0)

以下はこのように生成したrngを用いる.

一様乱数
#

区間 \( [0, 1) \)の一様乱数
#

rng.random(size)

  • rng.random(size=5)のように書いてもいいが,省略してrng.random(5)でも良い

スカラー
#

rng.random()

出力

0.39122819049566204

1次元配列
#

rng.random(5)    # 要素数5

出力

array([0.08564917, 0.23681051, 0.80127447, 0.58216204, 0.09412864])

2次元配列
#

rng.random((2, 2))    # 2行2列

出力

array([[0.43312694, 0.4790513 ],
       [0.15973891, 0.73457715]])

指定した範囲の整数の一様乱数
#

rng.integers(low, high, size)

rng.integers(low=0, high=10, size=5)

出力

array([9, 7, 2, 3, 6])
  • low(この場合は0)は範囲に含まれる
  • high(この場合は10)は範囲に含まれない

正規分布に従う乱数
#

rng.normal(loc=0.0, scale=1.0, size=None)

  • loc: 平均
  • scale: 標準偏差
  • size: ndarrayのサイズ

1次元配列
#

rng.normal(loc=0.0, scale=1.0, size=5)

出力

array([ 1.49673717, -2.03950384, -0.34031662, -0.60861062,  0.5327216 ])

分布をヒストグラムにした例
#

平均0,標準偏差1の標準正規分布はrng.standard_normal()も使える. rng.normal(loc=0.0, scale=1.0)と同じ.

# ---------- sample
rng = np.random.default_rng()
x = rng.standard_normal(size=10000)

# ---------- theory
xx = np.linspace(-4, 4, 1000)
yy = np.exp(-xx**2/2) / np.sqrt(2*np.pi)

# ---------- plot
fig, ax = plt.subplots()
ax.hist(
    x,
    bins=50,
    density=True,
    edgecolor='black',
    linewidth=0.5,
    label='Sample',
)
ax.plot(xx, yy, label='Theory')
ax.set_xlabel(r'$x$')
ax.set_ylabel('Probability density')
ax.legend()
NumPy - この記事は連載の一部です
パート 3: この記事