如果低于阈值,如何使该运算符发生

问题描述

我对这个 python 有点陌生。我正在尝试学习如何修改函数在这种情况下,我在网上找到了下面的代码。我想学习如何使其仅以概率 = 0.9 工作。也就是说,如果我有两个像 ('1001001010001','100000001100') 这样的二进制字符串,我只想以 0.9 的概率交换它们的一半。

那将是概率为 0.9 的代码将原始字符串切成两半,如 ('1 | 2','3 | 4') 并交换它们如 [1 | 4,3 | 2]。

这是我目前的代码

def crossover(i1,i2):
    assert len(i1) == len(i2)
    n = len(i1); split_index = random.randint(0+1,n-1)
    return '{}{}'.format(i1[:split_index],i2[split_index:]),\
           '{}{}'.format(i1[split_index:],i2[:split_index])

## in: ('00010','11000') out: ('00|000','010|11') with split at 2.

我是这么想的。尽管它有效,但它看起来一点也不优雅。任何帮助了解其他人会如何做?非常感谢您的帮助!!

def crossover(i1,i2,threshold):
    assert len(i1) == len(i2)
    n = len(i1); split_index = random.randint(0+1,i2[:split_index]) \
           if random.uniform(0,1) <= threshold \
           else '{}{}'.format(i1[:split_index],i1[split_index:]),\
           '{}{}'.format(i2[split_index:],i2[:split_index]) \

## in: ('00010','010|11') with split at 2.

解决方法

你的逻辑没问题,但你为什么用 format 做简单的连接? 另外,在非交换情况下,为什么要拆分每个字符串然后恢复其原始状态?

if random.uniform(0,1) <= threshold:
    return (i1[:split_index] + i2[split_index:],i1[split_index:] + i2[:split_index])
else:
    return (i1,i2)