【问题标题】:Weasel Program, Not understanding Python random library?黄鼠狼程序,不懂 Python 随机库?
【发布时间】:2013-01-01 09:55:15
【问题描述】:

我正在尝试 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”中的每个元素,如果发生突变,则将子元素中的特定元素更改为新的随机字符。然后“孩子”被添加到后代列表中。所以后代应该是这样的:

DDSMMHYODHFZTZRKWQUQYGMLUDB

DDSMMHYODHFZTZRKWMUQYGMLUDB

DDSMHYODHFZTZRKWQUQYGMLUDB

DPSMMHYODHFZTZRKWQUQYGMLQDB

(变体加粗)

乘以变量“gen”指定的次数。相反,我让每个孩子都完全一样,没有变化,就像这样:

DDSMMHYODHFZTZRKWQUQYGMLUDB

DDSMMHYODHFZTZRKWQUQYGMLUDB

DDSMMHYODHFZTZRKWQUQYGMLUDB

DDSMMHYODHFZTZRKWQUQYGMLUDB

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

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

【问题讨论】:

  • Python 2 还是 3?顺便说一句,您不能更改字符串。
  • print(mutation) 显示什么?
  • 除了字符串是不可变的,您的代码应该运行良好。使用pdbprint 语句/函数调用检查您对gencounter 的假设。

标签: python random for-loop


【解决方案1】:

复制child,然后将其附加到offspring

offspring.append(child[:])

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

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

【讨论】:

  • 这解决了问题,非常感谢!我想我应该更多地阅读 Python 的列表类型,因为我显然对它理解得不够好。不过,我感谢您的帮助,因为我当时不知道自己不理解什么。再次感谢。
猜你喜欢
  • 2021-04-09
  • 2015-05-27
  • 2023-03-30
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
相关资源
最近更新 更多