我正试图根据随机数的概率有效地突变二进制字符串中的值。下面是我生成的一个代码块,它可以工作,但我相信它可以做得更好,以减少在进行到操作成千上万的二进制字符串时的时间和内存使用。
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中。如果有任何关于如何使之更有效的意见,我将非常感激。
你只需要一个列表理解被消耗的。join
法。
b = ''.join(["1" if random.random() > 0.3 else "0" for _ in b])
一个完整的数学解只用位(和)。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'