Pythonでプログラム全体にランダムシードを設定する


82

私はかなり大きなプログラムを持っており、randomモジュールの関数をさまざまなファイルで使用しています。プログラムが常に同じ結果を返すように、ランダムシードを1か所に1回設定できるようにしたいと思います。それも達成できますpythonか?

回答:


116

実行されるメインのPythonモジュールはshouldand import randomcallです。random.seed(n)これは、他のrandom場所でシードがリセットされない限り、他のすべてのインポート間で共有されます。


3
知らないうちにどこかでシードをリセットできますか?メインファイルにシードを1回設定しても、トリックは実行されないため
Mischa Obrecht 2012

1
@MischaObrechtそうだと思います-シードはランダムモジュールの最初のインポートでのみ初期化されます-それが複数回インポートされた場合、初期化を実行してシードをリセットしません-したがって、コードのどこかに明示的な呼び出しが必要です
JonClements

3
randommainにインポートするモジュールレベルのコードからメソッドを呼び出す場合、mainに到達する前random.seed(n)に、それらの呼び出しはシードの前に行われるため、タイムシードされ、事実上再現不可能になります。ランダム。
Russell Borogove 2012

12
一部のサードパーティコードがRNGを再シードしていることが判明した場合(可能性は低いですが可能です)、random.Random()コンストラクターを介して独立した状態の追加の乱数ジェネレーターを作成し、厳密な再現性が重要な場合にそれらを使用できることに注意してください。
Russell Borogove 2012

これは私にはうまくいきません。そして、私には再現可能なコードがありません。インポートされたすべてのライブラリのドキュメントを確認する必要があると思います...(stackoverflow.com/questions/37886997/…–
B Furtado

36

zssのコメントは、実際の回答として強調表示する必要があります。

人々が注意しなければならないもう一つのこと:あなたがを使用しているなら、あなたは 種を設定numpy.randomするために使用numpy.random.seed()する必要があります。を使用してrandom.seed()も、から生成された乱数のシードは設定されませんnumpy.random。これはしばらく私を混乱させました。-zss


絶対に真実です。アプリケーションのどこかでからの乱数を使用している場合はrandom module、関数random.choices()と言い、さらに別のポイントでnumpy乱数ジェネレーターを使用してnp.random.normal()、両方のモジュールのシードを設定する必要があるとしましょう。私が通常行うことは、私のmain.py好きなものrandom.seed(my_seed)とに数行を入れることnp.random.seed(my_seed)です。ZSSする賞賛
Aenaon

Sageにも同様の問題があります。そのPRNGは、Pythonとnumpyの両方とは異なるためです。set_random_seed()セージに使用します。
ブレントバッカラ

8

アプリケーション呼び出しの開始時に、random.seed(x)xが常に同じであることを確認してください。これにより、アプリケーションの各実行中に疑似乱数のシーケンスが同じになります。


3

JonClementsは私の質問にほとんど答えています。しかし、それは本当の問題ではありませんでした。コードがランダムである理由は、条件の悪い行列に対して常に同じ結果が得られるとは限らないため、numpy.linalgSVDであることが判明しました。

したがって、同じ問題が発生した場合は、コードでそれを確認してください。


22
人々が注意しなければならないもう1つのこと:numpy.randomを使用している場合は、numpy.random.seed()を使用してシードを設定する必要があります。random.seed()を使用しても、numpy.randomから生成された乱数のシードは設定されません。これはしばらく私を混乱させました。
zss 2014年

1

以前の回答に基づいて:すべてのシードが制御されている場合でも、多くのコンストラクトが実行パスを分岐させる可能性があることに注意してください。

シードを設定して常に同じになるようにし、変更や外部の依存関係がないため、コードの実行パスは常に同じである必要がある」と考えていましたが、それは間違っています。

私を噛んだ例 list(set(...))は、結果の順序が異なる場合があります。


良い点、これは前に私を燃やした。また、データベースから結果を取得するようなものは、特に指定しない限り、(ランダムに)順序が
狂って返され

-14

独自の乱数ジェネレーターを使用することで、これを非常に簡単に保証できます。

3つの大きな素数を選択し(これが暗号化アプリケーションではないと仮定)、それらをa、b、およびcに接続します。a=((a * b)%c)これにより、かなりランダムなデータを生成するフィードバックシステムが得られます。すべての素数が同じように機能するわけではないことに注意してください。ただし、シミュレーションを実行しているだけの場合は、問題ではありません。ほとんどのシミュレーションに本当に必要なのは、パターン(疑似ランダム、覚えておいてください)が十分に複雑な数の寄せ集めです。アプリケーションと何らかの形で一致しません。

クヌースはこれについて話します。


10
Pythonの標準ライブラリには優れた乱数機能があり、何をしているのかわからない場合は非常に簡単に非常に悪いジェネレーターを作成できるため、独自にロールする必要はありません。
Russell Borogove 2012

6
私はそれがかなり悪い解決策であることに同意します:モンテカルロシミュレーション(私のプログラムはこれです)では、通常何百万ものサンプルを収集しますが、相関する乱数(悪いジェネレーターからのステム)は簡単に結果を台無しにする可能性があります!!
Mischa Obrecht 2012

つまり、クヌースはこれについていつも話しているのですか?今でも?
意味から意味へ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.