2017-09-14 11 views
0

同じプロジェクトの2つのPythonランが、異なる設定で同じランダムシードであります。`numpy.random`の状態の相違がなくなります

プロジェクトには、numpy.random.uniformを使用して2つの乱数を返す関数が含まれています。

Pythonプロセスでnumpy.randomを使用しているにもかかわらず、両方のランでの一連の関数呼び出しは、ある点まで同じシーケンスを生成します。

そして、その時点で一度異なる結果を生成した後、同じシーケンスをある期間生成します。

私はnumpy.random.RandomStateをまだ試していませんが、これはどのように可能ですか?

numpy.randomを使用しているどこかで不一致が発生し、再度修正されたのは偶然の一致ですか?

唯一の可能性があるのか​​、別の説明があるのか​​不思議です。

ありがとうございます。

ADD:その時点で種蒔きがなかったことを忘れてしまった。

+0

コードなしで、誰が知っていますか?彼らは明らかに電話の同じ正確なシーケンスを作っていませんが、同じ番号*の呼び出しをしているようです。私の推測では、ハッシュの順序付けに敏感なものがあるかもしれませんが、作業するデータはありません。 – hobbs

+0

再現可能な最小限の例を提供できますか?具体的な実装の詳細がなくても意味のある提案をするのは本当に難しいことです。 –

+0

ご意見ありがとうございます。それは実際には巨大なプロジェクトであり、私は他の可能性を除外したかったのです。 'numpy.random'関連の呼び出しをフックできるとデバッグが簡単になると思っていました。 – noname

答えて

0

numpyでrandomモジュールを使用すると、ランダムに生成された数字(分布/関数に関係なく)はRandomStateという同じ「グローバル」インスタンスを使用します。 numpy.random.seed()を使用してシードを設定する場合、RandomStateの「グローバル」インスタンスのシードを設定します。これは、Pythonのrandomライブラリと同じ原則です。

私はnumpy random関数の具体的な実装についてはわかりませんが、各ランダム関数が根本的なMersenne Twisterをいくつかの 'steps'に進めると考えています異なるrandom関数の間。 random機能へのすべての呼び出しの順序が別々の実行間で同じでない場合メルセンヌツイスター「ステップ」行場合

ので、その後は再び収束して、乱数の生成されたシーケンスに相違が表示されることがありもう一度。

使用している機能ごとに個別のRandomStateインスタンスを初期化することで、この問題を回避できます。例:

import numpy as np 

seed = 12345 
r_uniform = np.random.RandomState(seed) 
r_randint = np.random.RandomState(seed) 

a_random_uniform_number = r_uniform.uniform() 
a_random_int = r_randint.randint(10) 

各インスタンスに異なるシードを設定したい場合があります。これは、これらの擬似乱数をどのように使用しているかによって異なります。

+0

お返事ありがとうございます。そして、ええ、それを説明する他の方法はないようです。 – noname

+0

@nonameあなた自身の 'RandomState'インスタンスを常に初期化することをお勧めします。 'import random'を使って複数のインポートされたパッケージに関する問題を見つけ、それらのパッケージの1つ(またはあなたのコード)がシードを設定すると、* all *パッケージはシードされたランダムインスタンスになります。 –

関連する問題