0

さまざまなモジュールを含むプロジェクトがあります。次に、実行中にこれらのモジュールを呼び出すコードを含む Main.py というファイルがあります。ファイル Main.py で、次を使用してランダムシードを設定しました。

random.seed(2)

同じランダムシードを使用しても、異なる実行から得られる出力は同一ではありません。なぜこれが起こっているのか教えていただけますか?私のクラスのさまざまなモジュールはrandom.uniform, random.choice, random.sample関数を使用しています。ある場所では、私もそれを定義rnduniform = random.uniformして使用しています。

この問題を解決する方法 (つまり、ランダム シードを設定することで結果を複製できる) についての助けと、これを理解するのに役立つことは大歓迎です。

ありがとうございました。

編集:解決しました。私のエラー。

お時間を無駄にして申し訳ありません。コードを詳しく調べたところ、乱数生成を使用する関数の 1 つがクラスの 1 つのinitメソッドで呼び出されていました。シードが設定される前にinitメソッドにアクセスしました。投稿を削除しようとしましたが、できませんでした。したがって、この編集。

4

1 に答える 1

1

スレッド セーフは、並行プログラミング、つまり、スレッド化によって 2 つの異なるコードパスを同時に実行する場合を扱います。プログラマーにとって 1 行のコードである可能性があるものは、通常、多数の個別のアクションであるため、別のスレッドが、使用している変数に干渉したり、中間計算を使用したりする可能性があります。通常、コードは完全に問題ないように見えるため、これにより非常に理解しにくいバグが発生します。

この場合、彼はrandom()、乱数ジェネレーターを何らかの方法で使用しているスレッド内のコードを使用しているコードと他のコードが競合し、期待どおりに動作しない可能性があると言っています。たとえば、数値が数学的にランダムでなくなったり、特定の基本シードで初期化し、random()複数回の呼び出しで多数の設定値が返されることを期待する場合、それらの数値が期待どおりに返されない可能性があります。スレッドセーフではない関数を使用する最悪のケースでは、関数が複数のスレッドで同時に使用されるように設計されていないため、過酷な例外やクラッシュが発生する可能性があります。

ウィキペディアのスレッド セーフに関するトピックも参照してください。

于 2011-01-22T15:09:49.943 に答える