“随机”的独立实例

时间:2010-02-08 03:42:34

标签: python class random module seed

以下代码试图说明我想要的内容。我基本上想要两个“随机”的实例,它们彼此独立地运行。我想在一个类中种子“随机”而不影响另一个类中的“随机”。我怎么能这样做?

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

3 个答案:

答案 0 :(得分:19)

random.Random专门用于允许您想要的行为 - 模块本质上是单例,但是类被多次实例化,因此涵盖了两种需求。

如果您需要模块的独立副本(在random的情况下绝对不需要!),请尝试使用copy.deepcopy - 在许多情况下它会起作用。但是,需求非常罕见,因为模块通常不会保持全局可变状态,除非保留一个类的特权实例,它们也提供“外部消费”(其他示例旁边random包括fileinput )。

答案 1 :(得分:6)

对于播种的随机数,请创建自己的random.Random实例。 random documentation解释了这个类,当你在其中直接使用函数时,模块依赖于单个实例。

答案 2 :(得分: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具有单个种子和单个数字序列的理想随机性。因为两个并行序列对乘数和模数使用相同的常数,所以它们之间可能存在可检测的相关性。