Я не уверен, что вы подразумеваете под "генерацией точно такой же случайной последовательности". Поскольку вы даете нам только фрагмент кода, который не может быть запущен сам по себе, вполне возможно, что в других частях вашего кода есть ошибки, которые вы решили не показывать нам - я попытался добавить абсолютно минимальный объем кода необходим для запуска вашего фрагмента, то есть:
import random
import string
def self(): pass
self.alphabet = list(string.lowercase)
self.finalWord = []
self.length = 4
for x in range(5):
alphabet = self.alphabet
for i in range (self.length):
value = random.sample(alphabet, 1)
alphabet.remove(value[0])
self.finalWord.append(value[0])
print "Final word = ", self.finalWord
и вот что я вижу, когда запускаю этот самодостаточный скрипт несколько раз:
$ python sa.py
Final word = ['y', 'm', 'u', 'z']
Final word = ['y', 'm', 'u', 'z', 'h', 'b', 'c', 's']
Final word = ['y', 'm', 'u', 'z', 'h', 'b', 'c', 's', 'x', 'l', 'r', 'n']
Final word = ['y', 'm', 'u', 'z', 'h', 'b', 'c', 's', 'x', 'l', 'r', 'n', 'q', 'a', 'k', 'e']
Final word = ['y', 'm', 'u', 'z', 'h', 'b', 'c', 's', 'x', 'l', 'r', 'n', 'q', 'a', 'k', 'e', 'p', 'd', 'j', 'w']
$ python sa.py
Final word = ['k', 'v', 'o', 'd']
Final word = ['k', 'v', 'o', 'd', 'q', 'p', 'w', 'l']
Final word = ['k', 'v', 'o', 'd', 'q', 'p', 'w', 'l', 'n', 'u', 'g', 't']
Final word = ['k', 'v', 'o', 'd', 'q', 'p', 'w', 'l', 'n', 'u', 'g', 't', 'i', 'r', 'e', 'f']
Final word = ['k', 'v', 'o', 'd', 'q', 'p', 'w', 'l', 'n', 'u', 'g', 't', 'i', 'r', 'e', 'f', 's', 'c', 'j', 'z']
$ python sa.py
Final word = ['o', 'a', 'g', 't']
Final word = ['o', 'a', 'g', 't', 'k', 'j', 'y', 'w']
Final word = ['o', 'a', 'g', 't', 'k', 'j', 'y', 'w', 'z', 'l', 'i', 's']
Final word = ['o', 'a', 'g', 't', 'k', 'j', 'y', 'w', 'z', 'l', 'i', 's', 'u', 'p', 'f', 'm']
Final word = ['o', 'a', 'g', 't', 'k', 'j', 'y', 'w', 'z', 'l', 'i', 's', 'u', 'p', 'f', 'm', 'h', 'e', 'q', 'v']
Как вы видите, это что-то , но"точно такая же случайная последовательность" - он меняет каждый прогон, как и ожидалось.
Я полагаю, что я неправильно прочитал ваши мысли, пытаясь сделать ваш код исполняемым, и вы подразумеваете, что он будет использоваться совсем иначе, чем мой крошечный скрипт, но тогда чтение мыслей - ненадежное искусство (которое почему было бы намного лучше, если бы вы опубликовали отдельный, выполнимый пример, сделанный настолько малым, насколько это возможно, при воспроизведении вашей проблемы, вместо того, чтобы заставлять нас пытаться читать ваши мысли! -) .
Почему бы вам не настроить только что опубликованный автономный скрипт на минимально необходимую сумму, чтобы приблизить его к предполагаемому использованию и воспроизвести проблему, которую вы наблюдаете? Тогда Нам будет намного проще и продуктивнее обнаружить любую проблему, которая может возникнуть в вашем коде, и предложить лучший способ ее исправить!
Редактировать : код OP, вставленный в pastebin, имеет две ошибки, которые абсолютно не связаны с random
и объединяются, чтобы создать наблюдаемое поведение OP. Вот соответствующая часть кода, отредактированная:
class Phenotype:
...
chromosome = []
def __init__(self, alleles = []):
self.length = len(alleles)
self.alleles = alleles
self.initialBuild()
def initialBuild(self):
alleleSet = self.alleles
for i in range (self.length):
value = random.sample(alleleSet, 1)
alleleSet.remove(value[0])
self.chromosome.append(value[0])
Хорошо, здесь есть еще одна ошибка (использование старых, устаревших классов в новом коде вместо блестящих новых стилевых классов, которые всегда должны использоваться), но это не то, что кусает OP (пока), поэтому мы просто упомянем об этом мимоходом; -).
Ошибка 1: поскольку ни __init__
, ни какой-либо другой метод никогда не выполняют присваивание self.chromosome = ...
, все упоминания self.chromosome
в коде фактически относятся к единственному списку Phenotype.chromosome
, в котором все экземпляры Phenotype
классная доля. Так что неизбежно все такие экземпляры будут всегда иметь абсолютно одинаковые, идентичные chromosome
, несмотря ни на что. Исправление: добавьте self.chromosome = []
в __init__
(лучше также удалить переменные уровня класса, потому что они не приносят никакой пользы и только запутывают проблему).
Ошибка 2: посмотрите на следующие строки кода еще раз, чтобы определить его:
self.alleles = alleles
...
alleleSet = self.alleles
...
alleleSet.remove(value[0])
Понял? self.alleles
и локальное имя alleleSet
являются ссылками на точно один и тот же набор alleles
(или список, фактически), который был передан - так что remove
вызывает i изменяя коллекцию, которая была передана. Таким образом, эта коллекция остается пустой после создания самого первого фенотипа (именно поэтому, несмотря на ошибку 1, хромосома не продолжает расти: потому что коллекция аллелей остается пустой навсегда).
Исправлено: сделать копию, например. alleleSet = list(self.alleles)
, чтобы не повредить оригинальную коллекцию.
Лучшее исправление: то, что вы делаете, это чрезвычайно запутанный способ написания гораздо более простого кода, такого как:
self.chromosome = list(self.alleles)
random.shuffle(self.chromosome)
Т.е. просто получите случайную перестановку. Создание произвольной перестановки путем создания N отдельных выборок и удаления каждой выборки из коллекции по мере ее создания - это действительно обходной, медленный и сложный способ решения чрезвычайно простой проблемы! -)