乱数のシード¶
NumPyなどで生成される乱数は、擬似乱数といって必ずシードを元に作成されます。 シードは乱数の元になるもので、Pythonの環境を最初に実行した時に時刻などで初期化されます。 明示的にシードを指定しなくても、ランダムに乱数が発生するのはこのためです。
何度実行しても、同じ乱数列(結果の連なり)が出ることを再現性があるといいます。 次の2つの方法があります。
最初にシードを指定(
seed
という名前のオプションを使うことが多いです)状態を取得して、再現したいときに状態を設定
(注)シードを指定すると、乱数がリセットされた状態になりますので、通常は、最初に一度だけ指定します。
NumPyでは、numpy.random.get_state
で現在の状態を取得できます。また、numpy.random.set_state
で状態を設定して戻せます。
再現性が必要な状況は、さまざまです。 たとえばテストが終わってない場合、シードを設定して再現するようにしておけば、デバッグしやすいでしょう。
シード設定時の注意¶
シードを設定する場合、気をつけないといけないことがあります。 たとえば、銀行のATMの待ち行列のシミュレーションを考えましょう。 乱数を使っているので、待ち行列は長くなったり短くなったりするでしょう。
しかし、間違えて、顧客の到着間隔の乱数のシードと、顧客がATMで手続きする処理時間の乱数のシードを同じにしたとします。 そうすると、待ち行列の長さは0のままになります。これは、到着間隔と処理時間の相関が1のためです。
乱数を使う場合、無相関を仮定するケースが多いです。その場合は、異なるシードを指定したり、最初の1回だけ指定するなどの方法があります。