复制项目并根据偶然性

时间:2017-12-08 13:35:02

标签: python python-3.x list random append

函数重现有3个参数: 病毒(病毒列表)。 mutationProb(浮动0-1只有在复制时才有机会变异)和reproduProb(浮动0-1的机会重现)。因此,0.2,0.4的浮点数将使其重现40%,如果它再现20%的机会变异。

我已经编写了mutate函数,它可以正常工作:

def mutate(virus):
    # choose random index to change
    index = random.randint(0, len(virus) - 1)

    # make sure you are not using the previous char by removing it from 
    # the mutations to choose from
    mutations = [i for i in 'ATCG' if i != virus[index]]

    # swap out the char at index with a random mutation
    return virus[:index] + random.choice(mutations) + virus[index+1:]

但是如果病毒复制(基于reproduProb),我的复制不会将新病毒添加到列表中,新病毒应该添加到已经存在的病毒列表中,不管是否发生变异,(变异基于mutationProb)。

每种病毒都有个别机会繁殖

def reproduce(viruses, mutationProb, reproductionProb):
    for virus in viruses:
        if random.random() < reproductionProb:
            if random.random() < mutationProb:
                mutate(virus)
                viruses.append(virus)
            else:
                viruses.append(virus)
    return viruses

任何人都知道我的功能为什么不这样做?正如我所看到的,它附加了基于mutationProb的突变病毒,否则它会附加它而不会发生变异。

1 个答案:

答案 0 :(得分:1)

正如Carcigenicate所说,你要确保random.random() < reproductionProb正如你所期望的那样评估为真,即10次(或其他)中的4次。

就您的代码而言,如果您总是想要复制病毒,如果它符合再现标准(40%的可能性),那么只有在符合突变标准(20%几率)的情况下才变异,那么你可以稍微简化你的代码。

def reproduce(viruses, mutationProb, reproductionProb):
for virus in viruses:

    if random.random() < reproductionProb:
        if random.random() < mutationProb:
            mutate(virus)

        viruses.append(virus)

return viruses