【问题标题】:Randomly change/mutate one value in a list随机更改/改变列表中的一个值
【发布时间】:2019-04-24 23:05:16
【问题描述】:

我正在编写一个遗传算法,并希望随机改变列表中的一个数字。

如果我有一个列表,例如:

[1,2,3,4,5]

我如何获取列表并将其中一个数字更改为随机数,例如:

[1,2,7,4,5]

[1,3,3,4,5]

【问题讨论】:

  • 你试过什么?只需随机选择一个索引并在循环中随机选择一个值
  • list[random.randint(0,len(list)] = random.randint(0,maxtobedefine) docs.scipy.org/doc/numpy-1.15.1/reference/generated/…
  • @Alexis 这些是 numpy 的文档。这里不需要使用 numpy 来生成随机数,除非 OP 实际上有一个数组
  • @Alexis: IndexError
  • 另外,将变量命名为 list 也不是一个好主意

标签: python list random genetic-algorithm


【解决方案1】:

使用random.randrangerandom.randint

>>> import random
>>> index = random.randrange(len(mylist))
>>> mylist[index] = random.randint(minVal, maxVal)

 

编辑:如果您想始终进行更改(即永远不要让列表保持不变),请考虑将项目递增一个非零值:

>>> mylist[index] += random.choice([1, -1]) * random.randint(1, maxChange)

【讨论】:

  • 如果minValmaxVal 范围例如为:1、10,那么这也有可能返回相同的列表mylist
  • @Austin 对于一个 GA,我实际上可能会为了保持池中的随机性而吃掉这种可能性(并非所有东西都必须改变),但这是一个公平的观点 :)轶事,但我通常发现在紧密循环中接受空交换比尝试避免它更快
  • @roganjosh,如果范围较小,则更有可能;当我相信一些替代方案可以解决它时,我认为你不能忽视这一点。
  • @Austin:好点子,我添加了第二个示例以始终进行更改
  • @Austin 魔鬼代言人;如果范围很小,无论如何收敛都会很快。你最好压缩额外的“世代”。如果你可以通过接受重复而不是强制改变来获得3次迭代...... 。无论如何,编辑现在涵盖了两者:)
【解决方案2】:

使用random.randint:

l=[1,2,3,4,5]
import random
l[random.randint(0,len(l)-1)]=random.randint(min(l),max(l)-1)

现在:

print(l)

是(每次都不一样,这只是第一次输出):

[1, 4, 3, 4, 5]

【讨论】:

  • 这将给出一个IndexError,因为random.randint(a,b) 生成一个介于ab 之间的数字包含
  • 绝对是的! :-)
  • 您介意解释一下每个位的作用吗? l[random.randint(0,len(l)-1)]=random.randint(min(l),max(l)-1)
  • @Perry 抱歉回复晚了,好吧,所以第一部分 l[random.randint(0,len(l)-1) 正在获取列表的随机索引,然后将该列表的索引分配给..,现在是第二部分分配第一部分值,random.randint(min(l),max(l)-1),获取最小值和最大值之间的随机值。
【解决方案3】:

使用random.randint:

import random
temp_list = [1,2,3,4,5]
temp_list[index_of_list] = random.randint(minValue, maxValue)

或者你可以试试:

temp_list[random.randint(0, (len(temp_list))-1)] = random.randint(minValue, maxValue)

【讨论】:

  • index 是什么? :)
【解决方案4】:

类似问题的不同方法,我希望它对不同的观点有所帮助:)

只要我有 e.g. 混合字符串元素的列表,我就会使用 enumerate 和一些随机选择函数(在我的例子中来自 Numpy)。 例如当我有不同原子的列表时,我想从中随机选择一个只有一种类型的原子,我可以写:

import numpy as np

mixed_atm_list = ["Pb", "C", "H", "Pb", "C", "C", "Sn", "H"]
random_choice_atm = "C"

find_idx = [idx for idx, atm in enumerate(mixed_atm_list) if atm == random_choice_atm]

randomly_selected_carbon_atom = np.random.choice(find_idx)
randomly_selected_carbon_atom = mixed_atm_list[randomly_selected_carbon_atom]

【讨论】:

    猜你喜欢
    • 2021-11-02
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多