乱数のシード

NumPyなどで生成される乱数は、擬似乱数といって必ずシードを元に作成されます。 シードは乱数の元になるもので、Pythonの環境を最初に実行した時に時刻などで初期化されます。 明示的にシードを指定しなくても、ランダムに乱数が発生するのはこのためです。

何度実行しても、同じ乱数列(結果の連なり)が出ることを再現性があるといいます。 次の2つの方法があります。

  • 最初にシードを指定(seedという名前のオプションを使うことが多いです)
  • 状態を取得して、再現したいときに状態を設定

(注)シードを指定すると、乱数がリセットされた状態になりますので、通常は、最初に一度だけ指定します。

NumPyでは、numpy.random.get_stateで現在の状態を取得できます。また、numpy.random.set_stateで状態を設定して戻せます。

再現性が必要な状況は、さまざまです。 たとえばテストが終わってない場合、シードを設定して再現するようにしておけば、デバッグしやすいでしょう。

シード設定時の注意

シードを設定する場合、気をつけないといけないことがあります。 たとえば、銀行のATMの待ち行列のシミュレーションを考えましょう。 乱数を使っているので、待ち行列は長くなったり短くなったりするでしょう。

しかし、間違えて、顧客の到着間隔の乱数のシードと、顧客がATMで手続きする処理時間の乱数のシードを同じにしたとします。 そうすると、待ち行列の長さは0のままになります。これは、到着間隔と処理時間の相関が1のためです。

乱数を使う場合、無相関を仮定するケースが多いです。その場合は、異なるシードを指定したり、最初の1回だけ指定するなどの方法があります。