Независимые экземпляры 'случайных'

Ниже кода пытается проиллюстрировать то, что я хочу. Я в основном хочу два экземпляра "случайных", которые работают друг независимо от друга. Я хочу отобрать "случайный" в одном классе, не влияя "случайный" в другом классе. Как я могу сделать это?

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
14
задан Eli Bendersky 8 February 2010 в 03:55
поделиться

3 ответа

Class random.Random существует специально для обеспечения желаемого поведения - модули по сути являются синглетонами, но классы предназначены для многократного создания экземпляров, поэтому удовлетворяются оба типа потребностей.

Если вам когда-нибудь понадобится независимая копия модуля (чего вы определенно не имеете в случае random !), Попробуйте использовать на ней copy.deepcopy - в во многих случаях это сработает. Однако такая необходимость возникает очень редко, потому что модули обычно не сохраняют глобальные изменяемые состояния, за исключением сохранения одного привилегированного экземпляра класса, который они также предлагают для «внешнего потребления» (другие примеры, помимо random , включают fileinput ).

20
ответ дан 1 December 2019 в 09:01
поделиться

К сожалению, наличие двух независимых 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 )

Можно доказать, что ГСЧ обладают желаемыми свойствами случайности только для одного начального числа и одной последовательности чисел. Поскольку две параллельные последовательности используют одни и те же константы для множителя и модуля, есть шанс, что они могут иметь обнаруживаемую корреляцию друг с другом.

4
ответ дан 1 December 2019 в 09:01
поделиться

Для выбранных случайных чисел создайте собственный экземпляр random.Random . В random документации объясняется этот класс, от которого модуль зависит от одного экземпляра, когда вы используете функции непосредственно внутри него.

6
ответ дан 1 December 2019 в 09:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: