2010-02-08 40 views
8

Mã dưới đây cố gắng minh họa những gì tôi muốn. Về cơ bản tôi muốn hai trường hợp "ngẫu nhiên" hoạt động độc lập với nhau. Tôi muốn hạt giống "ngẫu nhiên" trong một lớp mà không ảnh hưởng "ngẫu nhiên" trong lớp khác. Làm thế nào tôi có thể làm điều đó?Các trường hợp độc lập 'ngẫu nhiên'

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 

Trả lời

17

Lớp random.Random tồn tại đặc biệt để cho phép hành vi mà bạn muốn - mô-đun chất độc thân, nhưng các lớp học có nghĩa là để được instantiated nhân, vì vậy cả hai loại nhu cầu được bảo hiểm.

Nếu bạn cần một bản sao độc lập của mô-đun (bạn chắc chắn không phải trong trường hợp random!), Hãy thử sử dụng copy.deepcopy trên đó - trong nhiều trường hợp nó sẽ hoạt động. Tuy nhiên, nhu cầu là rất hiếm, vì các mô-đun thường không giữ trạng thái biến đổi toàn cầu ngoại trừ bằng cách giữ một trường hợp đặc quyền của một lớp mà họ cũng cung cấp cho "tiêu thụ bên ngoài" (các ví dụ khác bao gồm random bao gồm fileinput).

+0

Trả lời trường hợp cụ thể cũng như vấn đề chung của tôi. Cảm ơn rất nhiều! – Lin

+3

Deepcopying một mô-đun âm thanh đáng sợ. – FogleBird

+0

Thật khó để nghĩ về một trường hợp khi tạo bản sao của một mô-đun có ý nghĩa trong một thiết kế hợp lý từ xa. –

5

Đối với các số ngẫu nhiên được gieo, hãy tạo ví dụ của riêng bạn là random.Random. Các random documentation giải thích lớp này, mà các mô-đun phụ thuộc vào một trường hợp duy nhất khi bạn sử dụng các chức năng trực tiếp bên trong nó.

3

Đáng buồn thay, có hai RNG độc lập có thể ít ngẫu nhiên hơn có một RNG đơn sử dụng "bù" vào chuỗi được tạo ra.

Sử dụng "bù đắp" có nghĩa là bạn phải tạo cả chuỗi mẫu hoàn chỉnh và sau đó sử dụng chúng cho mô phỏng của bạn. Một cái gì đó như thế này.

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 chỉ có thể được chứng minh là có các tính chất ngẫu nhiên mong muốn cho một hạt giống và một dãy số duy nhất. Bởi vì hai chuỗi song song sử dụng các hằng số giống nhau cho hệ số và mô đun, có khả năng là chúng có thể có mối tương quan có thể phát hiện được với nhau.

Các vấn đề liên quan