Random
numpy
multiprocessing

numpy.randomとmultiprocessingを併用するときの注意

どうもpjです. 前の記事で書いたことの詳細がわかりました. single processのときにも起こるようです.

問題

numpy.random.rand()などseedを自動で持ってくるものをmultiprocessingで並列化したときに乱数が規則的になる.

原因

https://mail.scipy.org/pipermail/numpy-discussion/2008-December/039184.html

Part of this is one of the gotcha's of simulation that is not specific
to multiprocessing and Python. Just highly likely to occur in your case
with multiprocessing but does occur in single processing. As David
indicated, many applications use a single source (often computer time)
to initialize the pseudo-random generators if an actual seed is not
supplied. Depending on the resolution as most require an integer so
minor changes may not be sufficient to change the seed. So the same seed
will get used if the source has not sufficiently 'advanced' before the
next initialization.

つまりはseedを取得するときにほとんどのアプリケーションでcomputer timeなど単一のソースから持ってきているため, 並列化したときにそれがスレッドごとに同じになってしまったようです.

解決策

random.seed()を使ってスレッドごとに違うseedを指定しましょう.