Machine Morning

機械学習やWebについて学んだことを記録しています。

疑似乱数のseedとは

擬似乱数を生成する際にseedを指定することができる。実は疑似乱数はあくまで'疑似'乱数なので、再現性のある乱数として利用することが可能だ。その再現性のある乱数を生成する際に指定するのがseedである。Pythonrandomモジュールでは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からは決まった順番で同じ値を生成するのである。これはデバッグをする際に疑似乱数生成時の挙動を固定するために使われる。