2011-02-02 9 views
7

私のプログラムのすべてのランダム性が完全に複製可能であることを確認する必要があります。どこにrandom.seed()を呼び出す必要がありますか?python 3:random.seed():どこから呼び出すのですか?

私はmain.pyモジュールにあるべきだと思っていましたが、ランダムな機能を使用する他のモジュールをインポートします。

私は自分のインポートを慎重にナビゲートして、どちらが最初に実行されるのかを確認できますが、コード構造を変更した瞬間にこの分析をやり直す必要があります。

シンプルで安全なソリューションはありますか?

+0

ランダム関数を使用するモジュールが複製可能性を阻害すると心配していますか?彼らがrandom.seed()を使用しない限り、それはうまくいくはずです。それがあなたの心配ではないなら、どうしてあなたのモジュールが何をするのか心配していますか? –

+0

アプリケーションの実際の作業を行う最上位の 'main()'関数がないと言っていますか?何故なの? –

+1

@Josh @S Lott:私は 'main'を持っています。それは、 'import random'、' import anothermodule'、 'random.random.seed()'のように始まります。 'anothermodule'もまた'ランダムなものをインポートし、 'random'の関数を使うので、私の播種はやや遅くなります。 – max

答えて

7

メインモジュールの "import section"でコードを実行するのは実際に安全です。したがって、ランダムモジュールを使用するかもしれないし、使用しないかもしれない他のモジュールをインポートすることがわからない場合は、あなたが複製するランダムたい場合

import random 
random.seed(seed_value) 

import something 
import else 

if __name__ == "__main__": 
    main() 
1

ランダムにカプセル化した独自のシングルトンをロールすることができます。次に、Python documentation on random getstateとsetstateを使用して、乱数ジェネレータの状態を変更することができます。それはあなたのプログラムに本質的に2つの乱数ジェネレータを与えます。

+0

random.random()の代わりに、random.WichmannHillインスタンスの「シングルトン」を作成し、再現性のある結果が必要なコード全体で使用することを検討してください。 random.random()を呼び出す他のすべてのモジュールは、あなたが気遣うことや知ることなく、そうすることができます。 – nos

4

のようなものを使用し、それは、あなたのアプリケーションにrandom.Randomのインスタンスを作成し、そのインスタンスにseed()を呼び出して、あなたの乱数のためにそのインスタンスを使用するのが最善です。

random.random()は、独自のクラスインスタンスを作成するのに十分気にしない人のために、実際にはrandom.Randomクラスのシングルトンを使用します。しかし、そのシングルトンは、何らかの理由で乱数を生成するためにrandom.random()を呼びたいかもしれない他のモジュールと潜在的に共有されています。そのため、あなたのケースでは、自分のrandom.Randomインスタンスをインスタンス化するほうがよいでしょう。

the docsから引用:このモジュールによって供給される

機能は、実際にrandom.Randomクラスの隠されたインスタンスのメソッドを結合しています。 Randomのインスタンスをインスタンス化して、状態を共有しないジェネレータを取得できます。

関連する問題