疑似乱数のseedとは
擬似乱数を生成する際にseed
を指定することができる。実は疑似乱数はあくまで'疑似'乱数なので、再現性のある乱数として利用することが可能だ。その再現性のある乱数を生成する際に指定するのがseed
である。Pythonのrandom
モジュールではrandom.seed()
で指定することができるが、numpyやその他のライブラリの方が使い勝手がいいので、ここではnumpyの疑似乱数生成について取り上げる。
>>> import numpy as np >>> np.random.rand(3, 2) array([[0.51001283, 0.48195016], [0.5218723 , 0.82022715], [0.96920762, 0.44068698]]) >>> np.random.rand(3, 2) array([[0.45066109, 0.24281556], [0.91331431, 0.4149912 ], [0.41034549, 0.67206978]]) >>> np.random.rand(3, 2) array([[0.98388966, 0.46484118], [0.27361121, 0.4054752 ], [0.67493293, 0.46253627]])
疑似乱数を生成する場合、numpyではrandom
を利用する。ここでは指定した形の疑似乱数を生成するrand
を利用した。疑似乱数を生成する度に異なる値を得ている。この値を再び疑似乱数生成器から取得するのは非常に難しい。
次にseed
を指定して疑似乱数を生成する。
>>> a = np.random.RandomState(10) >>> a.rand(2, 3) array([[0.77132064, 0.02075195, 0.63364823], [0.74880388, 0.49850701, 0.22479665]]) >>> a.rand(2, 3) array([[0.19806286, 0.76053071, 0.16911084], [0.08833981, 0.68535982, 0.95339335]]) >>> a.rand(2, 3) array([[0.00394827, 0.51219226, 0.81262096], [0.61252607, 0.72175532, 0.29187607]])
seed
に10を指定して疑似乱数生成器を初期化した。同様に疑似乱数を生成する度に値が変わっている。
>>> a = np.random.RandomState(10) >>> a.rand(2, 3) array([[0.77132064, 0.02075195, 0.63364823], [0.74880388, 0.49850701, 0.22479665]]) >>> a.rand(2, 3) array([[0.19806286, 0.76053071, 0.16911084], [0.08833981, 0.68535982, 0.95339335]]) >>> a.rand(2, 3) array([[0.00394827, 0.51219226, 0.81262096], [0.61252607, 0.72175532, 0.29187607]])
しかしもう一度同じようにseed
に10を指定して初期化して疑似乱数を生成すると、今度は乱数を生成する度に違う値を得ているが、先程と同じ順番で同じ値を得ていることがわかる。初期化すると同じseed
からは決まった順番で同じ値を生成するのである。これはデバッグをする際に疑似乱数生成時の挙動を固定するために使われる。