Python '的独立实例;随机';

Python '的独立实例;随机';,python,class,random,module,seed,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

下面的代码试图说明我想要什么。我基本上想要两个相互独立运行的“随机”实例。我想在一个类中播种“随机”,而不影响另一个类中的“随机”。我该怎么做

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

random.random
的存在是为了允许您想要的行为——模块本质上是单例的,但是类是要被多次实例化的,所以这两种需求都被涵盖了


如果您曾经需要模块的独立副本(在
随机
!)的情况下,您肯定不需要,请尝试在其上使用
copy.deepcopy
——在许多情况下,它都可以工作。然而,这种需求非常罕见,因为模块通常不会保持全局可变状态,除非它们保留一个类的特权实例以供“外部使用”(其他示例包括
random
包括
fileinput
)。

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

遗憾的是,有两个独立的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只能被证明具有理想的随机特性。因为两个平行序列使用相同的乘数和模常数,所以它们之间可能存在可检测的相关性。

回答了具体情况以及我的一般问题。谢谢!深度复制一个模块听起来很可怕。很难想象在一个合理的设计中复制一个模块是有意义的。@Mike,也许吧,但不是所有人都是合理的设计师@雾鸟,什么这么可怕?@Alex,给人们一些建议,让他们用有缺陷的、脆弱的方法来完成不合理的日常工作,这似乎很奇怪,这些方法违反了基本假设,特别是当这些方法甚至不适用于他们的问题时。这回答了你的问题吗。尽管这两个问题之间有相对的否决票/访问,但dupe中被接受的答案似乎比这条线索中的任何东西都更令人满意。