15

下面的代码试图说明我想要什么。我基本上想要两个相互独立运行的“随机”实例。我想在一个班级中播种“随机”而不影响另一个班级的“随机”。我怎样才能做到这一点?

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它——在许多情况下它会起作用。但是,这种需求非常少,因为模块通常不会保持全局可变状态,除非保留它们也提供给“外部消费”的类的一个特权实例(除此之外的其他示例random包括fileinput)。

于 2010-02-08T03:51:36.157 回答
7

对于种子随机数,制作您自己的random.Random. random文档解释了这个类,当您直接在其中使用函数时,该模块依赖于单个实例。

于 2010-02-08T04:08:43.087 回答
4

可悲的是,拥有两个独立的 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 只能被证明对单个种子和单个数字序列具有理想的随机性属性。因为两个并行序列对乘数和模数使用相同的常数,所以它们之间有可能具有可检测的相关性。

于 2010-02-08T13:14:06.883 回答