2010-02-08 3 views
8

아래 코드는 내가 원하는 것을 설명하려고 시도합니다. 나는 기본적으로 서로 독립적으로 작동하는 두 가지 "무작위"인스턴스를 원합니다. 다른 클래스의 "무작위"에 영향을주지 않고 한 클래스 내에서 "무작위"로 시드하려고합니다. 어떻게해야합니까?'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 

답변

17

클래스 random.Random 당신이 원하는 행동을 허용하기 위해 특별히 존재 - 모듈은 본질적으로 싱글이지만 클래스는 다중 인스턴스화위한 것이므로 요구의 두 종류가 적용됩니다.

모듈의 독립적 인 사본이 필요합니다 (정확히 random의 경우는 아닙니다!) copy.deepcopy을 사용해보십시오. 많은 경우 작동합니다. 그러나 모듈은 일반적으로 전역 변경 가능 상태를 유지하지 않으므로 "외부 소비"(다른 예제 인 random 예 : fileinput 포함) 클래스의 한 인스턴스를 유지해야합니다.

+0

내 일반적인 문제는 물론 특정 사례에 대한 답변입니다. 고마워요! – Lin

+3

모듈을 딥 카피하면 무서운 것처럼 들립니다. – FogleBird

+0

모듈 사본을 만드는 것이 원격으로 합리적인 설계 내에서 의미가있는 경우를 생각해보기가 어렵습니다. –

5

시드 된 난수는 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의는 하나의 종자와 숫자의 단일 시퀀스 바람직 임의성 속성이 입증 될 수있다. 두 개의 병렬 시퀀스는 승수와 모듈러스에 대해 동일한 상수를 사용하기 때문에 서로간에 탐지 가능한 상관 관계를 가질 수 있습니다.