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.391228190495662041次元配列 #
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()