ライブラリ
乱数を扱うには、numpy.randomライブラリが必要。
1 |
import numpy.random as rnd |
seed
~乱数系列の指定
乱数の系列を固定したいときはseed()
関数でシードを設定する。この設定をしないかシードにNone
を設定した場合は、実行ごとに乱数系列が変わる。
1 2 3 4 5 6 7 8 9 10 11 |
import numpy.random as rnd rnd.seed(0) print(rnd.randint(0, 10, 3)) print(rnd.randint(0, 10, 3)) print(rnd.randint(0, 10, 3)) # 何度実行しても結果は同じ # [5 0 3] # [3 7 9] # [3 5 2] |
並べ替え
shuffle()
引数で与えた配列の要素をシャッフルする。元の配列を書き換え、戻り値はNone
となる。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import numpy as np np.random.seed(0) a = np.arange(10) print(a) # [0 1 2 3 4 5 6 7 8 9] b = np.random.shuffle(a) print(a) # [2 8 4 9 1 6 7 3 0 5] print(b) # None |
permutation()
引数で与えた配列の要素をシャッフルした結果の配列を返す。元の配列は書き換えられない。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import numpy as np np.random.seed(0) a = np.arange(10) print(a) # [0 1 2 3 4 5 6 7 8 9] b = np.random.permutation(a) print(a) # [0 1 2 3 4 5 6 7 8 9] print(b) # [2 8 4 9 1 6 7 3 0 5] |
permutation(n)
の引数n
に整数を指定すると、permutation(np.arange(n))
と同じ効果を持つ。
1 2 3 4 5 6 7 |
import numpy as np np.random.seed(0) a = np.random.permutation(10) print(a) # [2 8 4 9 1 6 7 3 0 5] |
確率分布
一様分布~[0, 1)
rand()
引数なしのrand()
関数は[0, 1)の一様分布に従う乱数を1つ発生させる(random()
関数でも同じ)。
1 2 3 4 5 6 7 8 9 |
for n in range(5): r = rnd.rand() print(r) # 0.4807350243481273 # 0.725911967972944 # 0.18131883260203163 # 0.5975083028283003 # 0.10273697547412297 |
引数を1つ指定すると、その個数の乱数を要素に持つ配列を返す(random()
関数でも同じ)。
1 2 3 4 |
r = rnd.rand(3) print(r) # [ 0.70643994 0.89404594 0.32181352] |
引数を2つ指定すると、その行数・列数の2次元配列の乱数を、引数がn1、n2、n3、・・・の場合、n1×n2×n3×・・・の多次元配列を返す。
1 2 3 4 5 |
r = rnd.rand(2, 3) print(r) # [[ 0.26702118 0.7878606 0.90683757] # [ 0.66694304 0.0714021 0.00593714]] |
random_sample()/random()
random_sample()は、引数が1つの場合はrand()と同じだが。配列の場合はリストやタプルで次数を与える。
1 2 3 4 5 6 7 8 9 10 |
import numpy.random as rnd rnd.seed(0) print(rnd.random_sample(5)) print(rnd.random_sample((2, 3))) # [0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ] # [[0.64589411 0.43758721 0.891773 ] # [0.96366276 0.38344152 0.79172504]] |
random()はrandom_sample()と同じ。
1 2 3 4 5 6 7 8 9 10 |
import numpy.random as rnd rnd.seed(0) print(rnd.random(5)) print(rnd.random((2, 3))) # [0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ] # [[0.64589411 0.43758721 0.891773 ] # [0.96366276 0.38344152 0.79172504]] |
一様整数乱数~任意の範囲の整数
randint()
1~3個の引数をとり、終値未満の整数乱数を返す。終値を含まないため、配列からランダムに要素を取り出したい時に便利。
- 引数が1つ(n)の場合、[0, n)の範囲の整数乱数を1つ返す
- 引数が2つ(m, n)の場合、[m, n)の範囲の整数乱数を1つ返す
- 引数が3つ(m, n, s)の場合[m, n)の範囲の整数乱数s個を要素とする配列を返す
1 2 3 4 5 6 7 8 9 10 |
import numpy.random as rnd print([rnd.randint(3) for i in range(10)]) # [2, 2, 2, 1, 2, 0, 2, 0, 0, 2] print([rnd.randint(1, 3) for i in range(10)]) # [2, 1, 2, 2, 1, 2, 2, 1, 1, 2] print(rnd.randint(1, 3, 10)) # [1 1 2 2 2 2 2 1 2 1] |
サイズをリストやタプルで指定した場合、それに対応した次元・要素数の多次元配列で乱数列を返す。
1 2 3 4 5 6 7 8 9 |
import numpy.random as rnd lst = rnd.randint(1, 5, [3, 4]) print(lst) # 3行4列の乱数配列 # [[2 1 2 3] # [2 2 2 1] # [3 3 4 2]] |
random_integers()
引数の構成はrandint()
と同じだが、
- 上限値を含む、[start, end]の範囲の整数乱数
- 引数の意味は
randint()
と同じ
1 2 3 4 5 6 7 8 9 10 |
import numpy.random as rnd print([rnd.random_integers(3) for i in range(10)]) # [2, 1, 1, 1, 2, 3, 2, 3, 3, 3] print([rnd.random_integers(1, 3) for i in range(10)]) # [2, 2, 1, 2, 2, 2, 3, 1, 1, 1] print(rnd.random_integers(1, 3, 10)) # [1 2 1 2 1 3 1 1 1 2] |
正規分布
randn()
~標準正規分布
平均が0、標準偏差が1の標準正規分布に従う乱数を発生させる。配列で結果を得たいときはrand()
と同じように直接次数を指定する。
1 2 3 4 5 6 7 8 9 |
import numpy.random as rnd import matplotlib.pyplot as plt rnd.seed(0) x = rnd.randn(1000) fig, ax = plt.subplots() ax.hist(x, ec='k', fc='tab:cyan') plt.show() |
normal()~正規分布
normal(loc=0.0, scale=1.0, size=None)
loc
を平均、scale
を標準偏差とする正規分布に従う乱数を返す。
1 2 3 4 5 6 7 8 9 10 11 |
import numpy.random as rnd import matplotlib.pyplot as plt rnd.seed(0) x1 = rnd.normal(loc=10, scale=5, size=1000) x2 = rnd.normal(loc=-5, scale=10, size=1000) fig, ax = plt.subplots() ax.hist(x1, ec='k', range=(-40, 30), bins=20, fc='tab:blue', alpha=0.5) ax.hist(x2, ec='k', range=(-40, 30), bins=20, fc='tab:orange', alpha=0.5) plt.show() |
size
に整数を指定すると、その個数の乱数を配列で返す。
1 2 |
print(rnd.normal(loc=0.5, scale=2, size=5)) # [ 4.07725695 1.3730197 0.69299494 -3.22698541 -0.05477641] |
size
にリスト・タプルを指定すると、その形状の配列で乱数を返す。
1 2 3 |
print(rnd.normal(loc=1, scale=5, size=(2, 3))) # [[-0.7737949 0.58629259 -2.13500338] # [ 0.78090916 -1.38609015 -5.56932377]] |
loc
とscale
に同じ次数の配列を指定すると、それらがブロードキャストされた結果に従う乱数が配列で返される。
1 2 3 4 |
mu = [-1, 0, 1] sigma = [0.1, 1, 10] print(rnd.normal(mu, sigma)) # [-0.91153776 0.88131804 18.09573064] |
exponential()
~指数分布
指数分布。
- exponential(lmd) – 指数分布
- lmdは平均の逆数で、ポアソン過程でいう到着率、サービス率にあたる。
Tips
整数の乱数配列を生成する