根据给定的概率有效地变异二进制字符串中的字符

Efficiently mutate characters in a binary string based on given probability

我正在尝试根据随机数概率有效地改变二进制字符串中的值。下面是我生成的一段代码,它可以工作,但我相信在处理数千个二进制字符串时可以更好地减少时间和内存使用。

b = '111111'
c = [random.random() for x in range(len(b))]

for x in range(len(b)):
    z = list(b)
    if c[x] <= 0.3:
        print(x, True)
        z[x] = '0'
        b = ''.join(z)
    else:
        print(x, False)

使用此代码将根据生成的随机数生成类似于 b = '011010' 的结果。虽然这是我想要的结果,但我相信有一种更有效的方法来构造此代码,因此我不必在 for 循环的每次迭代期间重新列出并重新加入 b。非常感谢任何有关提高效率的意见。

您只需要一个列表理解即可被 join 方法使用。

b = ''.join(["1" if random.random() > 0.3 else "0" for _ in b])

完整的数学解决方案仅使用位(并且 log2 计算 b 的 "digits" 的数量或更好,如评论中所建议的那样,bit_length)。这不涉及字符串(除了开始解析和最后打印)

import random,math

b = 0b11111   # or int(b,2) to parse from string
new_b = 0
for x in range(b.bit_length()):
    # or shifted random bit
    new_b |= bool(random.random() > 0.3) <<x

示例输出:

>>> bin(new_b)
'0b11101'