私はかなり大きなプログラムを持っており、random
モジュールの関数をさまざまなファイルで使用しています。プログラムが常に同じ結果を返すように、ランダムシードを1か所に1回設定できるようにしたいと思います。それも達成できますpython
か?
回答:
実行されるメインのPythonモジュールはshouldand import random
callです。random.seed(n)
これは、他のrandom
場所でシードがリセットされない限り、他のすべてのインポート間で共有されます。
random
mainにインポートするモジュールレベルのコードからメソッドを呼び出す場合、mainに到達する前random.seed(n)
に、それらの呼び出しはシードの前に行われるため、タイムシードされ、事実上再現不可能になります。ランダム。
random.Random()
コンストラクターを介して独立した状態の追加の乱数ジェネレーターを作成し、厳密な再現性が重要な場合にそれらを使用できることに注意してください。
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する賞賛
set_random_seed()
セージに使用します。
JonClementsは私の質問にほとんど答えています。しかし、それは本当の問題ではありませんでした。コードがランダムである理由は、条件の悪い行列に対して常に同じ結果が得られるとは限らないため、numpy.linalgSVDであることが判明しました。
したがって、同じ問題が発生した場合は、コードでそれを確認してください。
独自の乱数ジェネレーターを使用することで、これを非常に簡単に保証できます。
3つの大きな素数を選択し(これが暗号化アプリケーションではないと仮定)、それらをa、b、およびcに接続します。a=((a * b)%c)これにより、かなりランダムなデータを生成するフィードバックシステムが得られます。すべての素数が同じように機能するわけではないことに注意してください。ただし、シミュレーションを実行しているだけの場合は、問題ではありません。ほとんどのシミュレーションに本当に必要なのは、パターン(疑似ランダム、覚えておいてください)が十分に複雑な数の寄せ集めです。アプリケーションと何らかの形で一致しません。
クヌースはこれについて話します。