我正在尝试根据随机数概率有效地更改二进制值。下面是我生成的代码块,并且可以正常工作,但是我认为在对成千上万的二进制字符串进行操作时,可以减少时间和内存使用,这会更好。
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
。感谢您提供任何有关提高效率的建议。
答案 0 :(得分:2)
您只需要使用join
方法来使用列表理解即可。
b = ''.join(["1" if random.random() > 0.3 else "0" for _ in b])
答案 1 :(得分: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'