Интеллектуальный генератор шестнадцатеричных чисел Python

Я хочу иметь возможность генерировать 12-символьную длинную цепочку, шестнадцатеричное, НО с не более чем двумя одинаковыми числами, дублирующимися в цепочке: 00, а не 000, потому что я знаю, как генерировать ВСЕ возможные варианты, включая 00000000000 в FFFFFFFFFFF, но я знаю что я не буду использовать все эти значения, и поскольку размер файла, генерируемого со ВСЕМИ возможностями, составляет много ГБ, я хочу уменьшить размер, избегая ненужных сгенерированных цепочек.

Поэтому моя цель - получить результаты типа 00A300BF8911, а не 000 000BF8911

Не могли бы вы помочь мне сделать это? Спасибо заранее!

6 ответов

Решение

Если вы выбрали один и тот же дважды, уберите его из списка раундов:

import random
hex_digits = set('0123456789ABCDEF')

result = ""
pick_from = hex_digits
for digit in range(12):
    cur_digit = random.sample(hex_digits, 1)[0]
    result += cur_digit
    if result[-1] == cur_digit:
        pick_from = hex_digits - set(cur_digit)
    else:
        pick_from = hex_digits

print(result)

Поскольку в названии упоминаются генераторы. Вот выше как генератор:

import random
hex_digits = set('0123456789ABCDEF')

def hexGen():
    while True:
        result = ""
        pick_from = hex_digits
        for digit in range(12):
            cur_digit = random.sample(hex_digits, 1)[0]
            result += cur_digit
            if result[-1] == cur_digit:
                pick_from = hex_digits - set(cur_digit)
            else:
                pick_from = hex_digits
        yield result

my_hex_gen = hexGen()
counter = 0

for result in my_hex_gen:
    print(result)
    counter += 1
    if counter > 10:
        break

Результаты:

1ECC6A83EB14
D0897DE15E81
9C3E9028B0DE
CE74A2674AF0
9ECBD32C003D
0DF2E5DAC0FB
31C48E691C96
F33AAC2C2052
CD4CEDADD54D
40A329FF6E25
5F5D71F823A4 

Вы также можете изменить цикл while true, чтобы производить только определенное их количество на основе числа, переданного в функцию.

Я интерпретирую этот вопрос следующим образом: "Я хочу построить радужную таблицу, перебирая все строки, имеющие следующие качества. Строка имеет длину 12, содержит только символы 0-9 и AF, и никогда не имеет одинакового символа появляются три раза подряд."

def iter_all_strings_without_triplicates(size, last_two_digits = (None, None)):
    a,b = last_two_digits
    if size == 0:
        yield ""
    else:
        for c in "0123456789ABCDEF":
            if a == b == c:
                continue
            else:
                for rest in iter_all_strings_without_triplicates(size-1, (b,c)):
                    yield c + rest

for s in iter_all_strings_without_triplicates(12):
    print(s)

Результат:

001001001001
001001001002
001001001003
001001001004
001001001005
001001001006
001001001007
001001001008
001001001009
00100100100A
00100100100B
00100100100C
00100100100D
00100100100E
00100100100F
001001001010
001001001011
...

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

import string, random

source = string.hexdigits[:16]
result = ''
while len(result) < 12 :
    idx = random.randint(0,len(source))
    if len(result) < 3 or result[-1] != result[-2] or result[-1] != source[idx] :
        result += source[idx]

Вы можете использовать генератор, перебирающий окно по строкам вашей текущей реализации. STH. лайк (hex_str[i:i + 3] for i in range(len(hex_str) - window_size + 1)) С помощью len а также set Вы можете посчитать количество различных символов в срезе. Хотя в вашем примере может быть проще просто сравнить все 3 символа.

Вы можете извлечь случайную последовательность из списка дважды каждой шестнадцатеричной цифры:

digits = list('1234567890ABCDEF') * 2
random.shuffle(digits)
hex_number = ''.join(digits[:12])

Если вы хотите разрешить более короткие последовательности, вы также можете рандомизировать это, и оставьте заполнить пробелы нулями.

import random

digits = list('1234567890ABCDEF') * 2
random.shuffle(digits)
num_digits = random.randrange(3, 13)
hex_number = ''.join(['0'] * (12-num_digits)) + ''.join(digits[:num_digits])

print(hex_number)

Вы можете создать массив от 0 до 255 и использовать random.sample со своим списком, чтобы получить ваш список

Другие вопросы по тегам