列表中随机生成的整数是相同的

Randomly generated integers in a list are the same

我的脚本遇到了这个问题。我想初始化一个遗传算法,在这种情况下,我想给行中的每个第一个元素一个 200 到 400 之间的随机值。

import random

def InitiatePopulation(Population,AmountofSettings):
    Generation= [None]*Population
    sett = []
    for k in range(0,Population):
        for j in range(0,AmountofSettings):
            sett.append(300)
        Generation[k] = sett
    for _k in range(0, len(Generation)):
        Generation[_k][0] = random.randint(200,400)
        for _p in range(1, len(Generation[_k]),3):
            Generation[_k][_p] = 20
    return Generation

每当我 运行 代码时,所有第一个值都是相同的值。我尝试调整种子值,但这不起作用。因为我过去在使用 for 循环时遇到过问题,所以问题可能就在那里。我知道代码不一定有效,我只是想在将第一个设置变量调整为随机整数之前创建人口。

这是当前输出:

[[221, 20, 300, 300, 20, 300, 300, 20, 300, 300, 20, 300],
[221, 20, 300, 300, 20, 300, 300, 20, 300, 300, 20, 300]]

除了 221 个值彼此不同之外,预期的输出是相同的。 我怎样才能做到这一点?

看起来问题是您将 Generation 的所有元素设置为同一个列表(即引用内存中的相同位置)。

您需要在每次迭代开始时将列表重新分配给一个新的空列表:

for k in range(0,Population):
    sett = []
    for j in range(0,AmountofSettings):
        sett.append(300)
    Generation[k] = sett

我知道有人回答了,我只是提供一个稍微优化的解决方案,如果你需要的话。我删除了 2 个 for 循环,现在它是一个外部列表理解的循环,因为它只需要 运行 一次。

import random

def InitiatePopulation(Population, AmountofSettings):
    Generation = []
    sett = [20 if (x-1) % 3 == 0 else 300 for x in range(AmountofSettings)]
    
    for _ in range(Population):
        _sett = sett.copy()
        _sett[0] = random.randint(200,400)
        Generation.append(_sett)
               
    return Generation

print(InitiatePopulation(2, 12))