【问题标题】:Python: How do I randomly mix two lists?Python:如何随机混合两个列表?
【发布时间】:2019-04-24 15:52:12
【问题描述】:

如果我生成两个随机列表,例如:

N=5
X=20

parent1 = np.random.choice(X, N, replace=True)
parent2 = np.random.choice(X, N, replace=True)

会给出两个列表,例如:

[2,5,1,1,12]
[3,18,4,5,1]

我怎样才能创建一个新列表,它是两个具有相同数量的列表的随机组合?

例如

[2,18,1,5,12]

[18,5,1,12,5]

顺序无关紧要。

【问题讨论】:

  • 是否允许多次选择同一个号码?
  • random.sample(a+b, N) 可以吗?
  • 循环;随机生成一或零;如果是从第一个列表中随机选择一个;否则从第二个列表中选择一个随机选项;达到项目限制时停止,
  • 父母的长度一定一样吗?

标签: python python-3.x list random genetic-algorithm


【解决方案1】:

继续你的例子,你可以简单地试试这个:

result = np.random.choice(np.concatenate([parent1,parent2]), N, replace=False)

是否更换样品由您选择(参数replace)。

【讨论】:

  • parent1+parent2 会添加两个数组对应的元素!
  • @bro-grammer 你是对的。忘记了 parent1parent2 是数组而不是列表。通过连接它们来修复它。
【解决方案2】:

如果给你parent1parent2,你可以使用np.choose

which_one = np.random.int(2, size=N).astype(np.bool)
out_array = np.choose(which_one, [parent1, parent2])

但是,请记住,如果 parent1parent2 在您的代码中都是随机的,那么您可以简单地这样做

out_array = np.random.choice(X, N, replace=True)

【讨论】:

    【解决方案3】:

    从 2 个列表中获得统一随机选择的几种方法。

    • 随机 0 或 1 选择列表,然后在列表中随机选择。
    • 随机数直到列表的总和,然后根据该数字使用逻辑从第一个或第二个列表中进行选择。

    .

    import random
    #### Option 1
    for i in range(len(parent1)):
       list_number = random.randint(1,3)
       output(i) = exec('np.random.choice(parent'+str(list_number)+')')
    
    #### Option 2
    output_list = np.random.choice(np.concatenate([parent1,parent2]), N, replace=False)
    

    前者在输出中平等地表示每个列表,而不考虑它们的相对长度,后者根据列表的相对长度进行采样。

    【讨论】:

    • 选项 2 非常简单,正是我想要的。谢谢! :)
    • “replace=False”究竟是什么意思?
    • 当重复从列表[parent1, parent2]中选择时,您是否“替换”您选择的数字(以便可以再次选择)?
    • 同一个号码不能重复使用,除非有重复号码
    • 对不起,这是我对Replace=False的解释。上面的代码按你的要求做。
    【解决方案4】:

    一种方法是:

    N=5
    select_one = np.random.randint(0,2,N) # Outputs an array of 1 or 0s
    mixed_list = select_one*parent1 + (1 - select_one)*parent2   
    

    如果你还想随机排列列表元素,可以使用:

    mixed_list = np.random.permutation(rand_fact*parent1 + (1 - rand_fact)*parent2)
    

    【讨论】:

      猜你喜欢
      • 2019-04-27
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 2019-04-26
      相关资源
      最近更新 更多