我不确定你所说的“生成完全一样随机序列”。由于您只给我们一个无法单独运行的代码片段,因此您的代码的其他部分很可能存在您选择不向我们展示的错误 - 我尝试添加绝对运行您的代码片段所需的最少量的代码,即:
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']
如你所见,这是什么but“完全相同的随机序列”——它每次运行都会改变,正如预期的那样。
我想当我试图使你的代码可执行时,我错误地读懂了你的想法,并且你的意思是它的使用方式与我的小脚本使用它的方式非常不同——但是读心术是一种不可靠的艺术(这就是为什么它会如果你发布一个独立的,那就更好了,runnable例如,尽可能小,同时仍然重现您的问题,而不是强迫我们尝试读懂您的想法!-)。
您为什么不按所需的最小数量调整我刚刚发布的独立脚本,使其更接近您的预期用途,并重现您观察到的问题?Then对我们来说,发现您的代码可能存在的任何问题并提出解决问题的最佳方法将变得更加容易和高效!
Edit:粘贴在pastebin中的OP代码有两个与以下完全无关的错误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的原因,所以我们只是顺便提一下; -)。
Bug 1:因为两者都没有__init__
也没有任何其他方法进行分配self.chromosome = ...
,所有提到的self.chromosome
在代码中实际上引用了唯一的列表Phenotype.chromosome
其中所有实例Phenotype
班级份额。所以不可避免地all此类情况将always有完全相同的,相同的chromosome
,无论如何。修复:添加self.chromosome = []
in __init__
(最好也删除类级变量,因为它们没有任何好处,只会混淆问题)。
Bug 2:再次查看以下代码行来发现它:
self.alleles = alleles
...
alleleSet = self.alleles
...
alleleSet.remove(value[0])
知道了?self.alleles
和当地的名字alleleSet
都是参考exactly一且相同alleles
传入的集合(实际上是列表)——所以remove
call i altering因此,在实例化第一个表型后,该集合将留空(这就是为什么尽管存在 Bug 1,染色体却不会继续增长:因为等位基因集合永远留空)。
修复:复制一份,例如alleleSet = list(self.alleles)
,避免损坏原藏品。
更好的解决办法:你正在做的是极其拼写更简单的代码的复杂方式,例如:
self.chromosome = list(self.alleles)
random.shuffle(self.chromosome)
即,只需获得随机排列。通过执行 N 个单独的样本并在生成时从集合中删除每个样本来构建随机排列,这是解决极其简单问题的一种非常迂回、缓慢且复杂的方法!-)