基于给定的概率,有效地突变二进制字符串中的字符。

问题描述 投票:1回答:2

我正试图根据随机数的概率有效地突变二进制字符串中的值。下面是我生成的一个代码块,它可以工作,但我相信它可以做得更好,以减少在进行到操作成千上万的二进制字符串时的时间和内存使用。

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' 基于生成的随机数。虽然这是我想要的结果,但我相信有一个更有效的方法来构建这段代码,这样我就不必重新列举和重新加入 b 在每次迭代的for-loop中。如果有任何关于如何使之更有效的意见,我将非常感激。

python genetic-algorithm
2个回答
2
投票

你只需要一个列表理解被消耗的。join 法。

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

2
投票

一个完整的数学解只用位(和)。log2 的 "位数 "来计算 b 或更好,如评论中所建议。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'
© www.soinside.com 2019 - 2024. All rights reserved.