【问题标题】:Independent instances of 'random'“随机”的独立实例
【发布时间】:2010-02-08 03:42:33
【问题描述】:

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

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

【问题讨论】:

  • 这能回答你的问题吗? python maintain two different random instance。尽管这两个问题之间的反对票/访问量相对较低,但在欺骗中接受的答案似乎比该线程中的任何内容都更令人满意。

标签: python class random module seed


【解决方案1】:

random.Random 类的存在是专门为实现您想要的行为而存在的——模块本质上是单例的,但类是要被多次实例化的,因此这两种需求都被满足了。

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

【讨论】:

  • 回答具体案例以及我的一般问题。非常感谢!
  • 深拷贝模块听起来很可怕。
  • 很难想出一个例子,在一个远程合理的设计中复制一个模块是有意义的。
  • @Mike,也许吧,但并非所有人都是理性的设计师。 @FogleBird,有什么可怕的?
  • @Alex,建议人们使用违反基本假设的错误、脆弱的方法来完成不合理的例程似乎很奇怪,尤其是当它甚至不适用于他们的问题时。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      相关资源
      最近更新 更多