python - Weasel 程序,不懂 Python 随机库?

标签 python random for-loop

我正在尝试使用 Richard Dawkin 的 Weasel Program 的 Python 版本这演示了随机选择与累积选择之间的差异,并且我的变异算法存在一些问题。我想也许我不明白如何使用Python随机库。这是有问题的代码:

#Cumulative selection guesser
while counter <  2:
    for i in range(gen):
        for j in range(len(child)):
            mutation = random.randint(0,99)
            if mutation in range(5):
                 child[j] = random.choice(chars)
        offspring.append(child)
    counter += 1

“Counter”用于测试,一旦代码完成,将更改为与目标短语是否相等的测试,“child”是28个随机字母的列表,“gen”是代数,是只是一个常数,如 100 或 50,“chars”是大写字母和空格字符的字符串,“offspring”是一个空列表,我想将所有生成的“子项”放入其中。如果这不能使我感觉我可以包含其余的代码,但我遇到的主要问题是每一代的每个 child 都是完全相同的。

应该发生的事情是代码遍历“child”中的每个元素,然后掷骰子进行突变,如果发生突变,则将 child 中的特定元素更改为新的随机字符。然后“ child ”被添加到后代列表中。所以后代应该是这样的:

DDSMMHYODHFZTZRKWQUQYGMLUDB

DDSMMHYODHFZTZRKWMUQYGMLUDB

DDSMIHYODHFZTZRKWQUQYGMLUDB

DPSMMHYODHFZTZRKWQUQYGMLQDB

(粗体变体)

乘以变量“gen”指定的数量。相反,我让每个 child 都完全相同,没有任何变化,如下所示:

DDSMMHYODHFZTZRKWQUQYGMLUDB

DDSMMHYODHFZTZRKWQUQYGMLUDB

DDSMMHYODHFZTZRKWQUQYGMLUDB

DDSMMHYODHFZTZRKWQUQYGMLUDB

等等。我花了很长时间试图找出问题所在,并尝试单独测试代码的每个部分,它似乎按我的预期运行。我唯一能想到的是“mutation”的值没有改变,因为当调用“random.randint()”时它只生成一个随机整数一次。这就是随机函数的工作原理吗?我希望 for 循环的每次迭代都会生成一个新的随机整数。

如果有人有任何想法或建议,我将不胜感激。我在这里用头撞墙。另外,如果有帮助的话,我可以发布整个代码。谢谢!

最佳答案

在将 child 附加到 offspring 之前,先复制它:

offspring.append(child[:])

child[:] 返回一个与 child 内容相同的新列表。由于它是一个新列表,因此 child 的 future 突变不会影响 child[:]

如果您不这样做,offspring 将包含对完全相同列表的多个引用。因此,child 的每个突变都会影响 offspring 中的每个项目。 offspring 中的每一项最终都等于 child 的最后一个值。

关于python - Weasel 程序,不懂 Python 随机库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14109460/

相关文章:

php - 每周执行一次 php 代码,但随机一天

python - 如何均匀地间隔数据框中的日期数据?

python - 如何访问自定义 prop_cycle 颜色?

python - 如何使用 tkinter 在 python 中嵌入 python 解释器框架?

python - model.save_weights 和 model.load_weights 未按预期工作

math - 寻找有趣的公式

python - 如何用自己的生成器覆盖Python的随机数?

Javascript在for循环中创建数组

Objective-C for 循环到 Swift 3

python - 根据条件检查修改循环