Эффективно мутировать двоичное значение на основе случайного числа - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь эффективно изменить значения в двоичном коде на основе вероятности случайного числа. Ниже приведен блок кода, который я сгенерировал, и он работает, но я считаю, что это можно было бы сделать лучше, чтобы сократить время и использование памяти при манипулировании тысячами двоичных строк.

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. Будем весьма благодарны за любые замечания по повышению эффективности.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

полное математическое решение использует только биты (и 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'
0 голосов
/ 29 октября 2018

Для использования метода join вам просто нужно понимание списка.

b = ''.join(["1" if random.random() > 0.3 else "0" for _ in b])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...