4

Per反復可能な乱数シーケンスを生成する方法? 後続の randint の呼び出しが同じ数値を返すことを期待できるように、random モジュールの状態を設定することができます。

このアプローチで見られる制限の 1 つは、状態がモジュール レベル (本質的にはグローバル変数) で設定されるため、反復可能な乱数の複数のストリーム/イテレータを作成することは不可能に思われることです (ただし、ストリームの呼び出しは任意にインターリーブできます)。 ) 現在のメカニズムで。これを可能にする回避策/代替ライブラリはありますか?

4

2 に答える 2

8

モジュール レベルで状態を維持する必要はありません。モジュールのドキュメントを参照してrandomください

このモジュールによって提供される関数は、実際にはrandom.Randomクラスの隠しインスタンスのバインドされたメソッドです。Random の独自のインスタンスをインスタンス化して、状態を共有しないジェネレーターを取得できます。jumpahead()これは、スレッドごとに Random の異なるインスタンスを作成し、このメソッドを使用して、各スレッドで見られる生成されたシーケンスが重複しないようにするマルチスレッド プログラムに特に役立ちます。

于 2013-08-14T14:45:08.860 に答える
5

random.Random()あなたが探しているものです。

http://hg.python.org/cpython/file/2.7/Lib/random.py#l72

すべてのモジュール レベルの関数は、 に存在する共有インスタンスrandom.*の単なるプロキシです。Random()random._inst

http://hg.python.org/cpython/file/2.7/Lib/random.py#l879

あなたの状況では、N 個のrandom.Random()インスタンスをインスタンス化するだけです。それらは独立した内部 RNG 状態を持ち、互いに影響を与えることなくシード/消費できます。

実際、自明ではないアプリケーション用に独自のインスタンスを作成するのがベスト プラクティスであると考えていRandom()ます。具体的には、状態に依存するバグなどがある場合に簡単に再現できるようにするためです。特にテスト スイートでは、これは非常に貴重です。

于 2013-08-14T14:45:26.023 に答える