根据随机数有效地改变二进制值

时间:2018-10-29 17:22:29

标签: python python-3.x genetic-algorithm

我正在尝试根据随机数概率有效地更改二进制值。下面是我生成的代码块,并且可以正常工作,但是我认为在对成千上万的二进制字符串进行操作时,可以减少时间和内存使用,这会更好。

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。感谢您提供任何有关提高效率的建议。

2 个答案:

答案 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'