15

以下のコードは、私が欲しいものを説明しようとしています。基本的に、互いに独立して動作する「ランダム」の2つのインスタンスが必要です。別のクラスの「ランダム」に影響を与えずに、あるクラス内に「ランダム」をシードしたい。どうやってやるの?

class RandomSeeded:
    def __init__(self, seed):
        import random as r1
        self.random = r1
        self.random.seed(seed)
    def get(self):
        print self.random.choice([4,5,6,7,8,9,2,3,4,5,6,7,])

class Random:
    def __init__(self):
        import random as r2
        self.random = r2
        self.random.seed()
    def get(self): 
        print self.random.choice([4,5,6,7,8,9,2,3,4,5,6,7,])

if __name__ == '__main__':
    t = RandomSeeded('asdf')
    t.get()       # random is seeded within t
    s = Random()
    s.get()       
    t.get()       # random should still be seeded within t, but is no longer
4

3 に答える 3

21

クラスrandom.Randomは、必要な動作を可能にするために特別に存在します。モジュールは本質的にシングルトンですが、クラスは複数のインスタンス化を目的としているため、両方の種類のニーズに対応します。

randomモジュールの独立したコピーが必要になった場合( !の場合は絶対に必要ありません)、それを使用copy.deepcopyしてみてください。多くの場合、機能します。ただし、モジュールが「外部消費」のために提供するクラスの特権インスタンスを1つ保持する場合を除いて、モジュールは通常、グローバルな可変状態を保持しないため、この必要性は非常にまれです(他の例randomには、が含まれますfileinput)。

于 2010-02-08T03:51:36.157 に答える
7

シードされた乱数については、の独自のインスタンスを作成しますrandom.Randomrandomドキュメントでは、このクラスについて説明しています。このクラスは、モジュール内で関数を直接使用する場合の単一のインスタンスに依存します。

于 2010-02-08T04:08:43.087 に答える
4

悲しいことに、2つの独立したRNGを持つことは、生成されたシーケンスへの「オフセット」を使用する単一のRNGを持つことよりもランダム性が低くなる可能性があります。

「オフセット」を使用するということは、サンプルの両方の完全なシーケンスを生成してから、それらをシミュレーションに使用する必要があることを意味します。このようなもの。

def makeSequences( sequences=2, size=1000000 ):
    g = random.Random()
    return [ [ g.random() for g in xrange(size) ] for s in xrange(sequences) ] ]

t, s = makeSequences( 2 )

RNGは、単一のシードと単一の数列に対して望ましいランダム性を備えていることを証明することしかできません。2つの並列シーケンスは、乗数とモジュラスに同じ定数を使用するため、相互に検出可能な相関関係を持つ可能性があります。

于 2010-02-08T13:14:06.883 に答える