random
モジュールの関数をさまざまなファイルで使用する、かなり大きなプログラムがあります。プログラムが常に同じ結果を返すように、ランダム シードを 1 か所で 1 回設定できるようにしたいと考えています。それはでも達成できますpython
か?
9 に答える
実行されるメインの python モジュールはimport random
呼び出します。これは、他の場所でシードがリセットされない限り、random.seed(n)
他のすべてのインポート間で共有されます。random
アプリケーション呼び出しの最初に、random.seed(x)
x が常に同じであることを確認します。これにより、疑似乱数のシーケンスがアプリケーションの各実行中に同じになることが保証されます。
Jon Clements が私の質問にほとんど答えてくれます。しかし、それは本当の問題ではありませんでした:私のコードのランダム性の理由は numpy.linalg SVD であることが判明しました.条件の悪い行列に対して常に同じ結果を生成するとは限らないためです!!
同じ問題がある場合は、コードでそれを確認してください。
以前の回答に基づいて構築します。すべてのシードが制御されている場合でも、多くの構成要素が実行パスを分岐できることに注意してください。
私は「シードを設定して常に同じになるように設定し、変更/外部依存関係がないため、コードの実行パスは常に同じにする必要がある」と考えていましたが、それは間違っています。
私を悩ませた例は list(set(...))
で、結果の順序が異なる場合があります。
これは、独自の乱数ジェネレーターを使用することで簡単に保証できます。
3 つの大きな素数 (これは暗号化アプリケーションではないと仮定) を選択し、それらを a、b、および c に挿入するだけです: a = ((a * b) % c) これにより、かなりランダムなデータを生成するフィードバック システムが得られます。すべての素数が同じようにうまく機能するわけではないことに注意してください。ただし、シミュレーションを行うだけであれば問題ありません。ほとんどのシミュレーションで本当に必要なのは、パターン (擬似乱数、覚えておいてください) を持つ数字の寄せ集めだけです。アプリケーションと何らかの形で一致しません。
クヌートはこれについて語っています。