17

Генерация случайной строки с заглавными буквами и цифрами

19

Как мне сгенерировать строку длиной N, состоящую из чисел и заглавных английских букв, таких как:

  • 6U1S75
  • 4Z4UKK
  • U911K4

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

5 ответ(ов)

0

Лучший подход, который можно считать более быстрым, но немного менее случайным, заключается в использовании random.sample вместо выбора каждой буквы по отдельности. Если разрешены n-повторы, увеличьте вашу случайную основу в n раз, например:

import random
import string

char_set = string.ascii_uppercase + string.digits
print(''.join(random.sample(char_set * 6, 6)))

Обратите внимание: random.sample предотвращает повторное использование символов, поэтому увеличение размера множества символов позволяет многократные повторения, но они по-прежнему менее вероятны, чем в чисто случайном выборе. Если мы рассматриваем строку длиной 6 и выбираем 'X' в качестве первого символа, то в случае выбора вероятность получения 'X' в качестве второго символа такая же, как и вероятность получения 'X' в качестве первого символа. В реализации random.sample вероятность получить 'X' в любом последующем символе составляет только 6/7 от шанса получить его в качестве первого символа.

0

Для генерации случайной строки в нижнем регистре в Python вы можете использовать модуль uuid. Ниже представлен пример кода, который создает случайный UUID и преобразует его в строку в верхнем регистре:

import uuid

# Генерация случайного UUID и преобразование его в строку в нижнем регистре
lowercase_str = uuid.uuid4().hex  

В результате lowercase_str будет иметь вид, например, 'cea8b32e00934aaea8c005a35d85a5c0'.

Теперь, чтобы преобразовать эту строку в верхний регистр, вы можете использовать метод .upper():

uppercase_str = lowercase_str.upper()

В результате uppercase_str будет выглядеть как 'CEA8B32E00934AAEA8C005A35D85A5C0'.

Таким образом, lowercase_str и uppercase_str представляют собой одну и ту же случайную строку, просто в разных регистрах.

0

Конечно! Вот перевод на русский в стиле ответа на StackOverflow:


Я думал, что на этот вопрос ещё никто не ответил, ха-ха! Но вот моя версия решения:

import random

def random_alphanumeric(limit):
    # ASCII таблица всех алфавитно-цифровых символов
    r = (range(48, 58) + range(65, 91) + range(97, 123))
    random.shuffle(r)
    return reduce(lambda i, s: i + chr(s), r[:random.randint(0, len(r))], "")

Эта функция генерирует случайную строку, состоящую из алфавитно-цифровых символов, но обратите внимание, что в коде есть некоторые недочёты. Например, функция reduce требует импорта из модуля functools. Кроме того, limit не используется в логике генерации строки.

Вместо этого можно немного подправить код:

import random
import string

def random_alphanumeric(limit):
    # Генерируем случайную алфавитно-цифровую строку заданной длины
    characters = string.ascii_letters + string.digits
    return ''.join(random.choice(characters) for _ in range(limit))

Теперь limit действительно используется, и функция вернёт случайную строку нужной длины. Надеюсь, это поможет!

0

Этот метод немного быстрее и немного более неудобен, чем метод random.choice(), предложенный Игнасио.

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

# длина должна быть 32 -- 5 бит -- вопрос не уточнял, что нужно использовать полный набор
# заглавных букв ;)
_ALPHABET = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'

def generate_with_randbits(size=32):
    def chop(x):
        while x:
            yield x & 31
            x = x >> 5
    return ''.join(_ALPHABET[x] for x in chop(random.getrandbits(size * 5))).ljust(size, 'A')

...создает генератор, который извлекает 5-битные числа за раз от 0 до 31, пока не останется ни одного

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

При использовании Timeit, для строк длиной 32 символа, время исполнения составило:

[('generate_with_random_choice', 28.92901611328125),
 ('generate_with_randbits', 20.0293550491333)]

...но для строк длиной в 64 символа randbits проигрывает 😉

Наверное, я никогда не стал бы использовать этот подход в рабочем коде, если бы не испытывал неприязни к своим коллегам.

Правка: обновлено в соответствии с вопросом (только заглавные буквы и цифры) и использует битовые операторы & и >> вместо % и //.

0

Вам нужно использовать функцию numpy.random.choice() для генерации случайной строки, состоящей из заглавных букв и цифр. Вот пример, как это можно сделать:

import numpy as np
import string        

if __name__ == '__main__':
    length = 16  # Длина генерируемой строки
    # Генерируем массив случайных символов
    a = np.random.choice(list(string.ascii_uppercase + string.digits), length)                
    # Объединяем массив символов в строку и выводим на экран
    print(''.join(a))

Этот код импортирует необходимые модули, задает длину строки и генерирует массив случайных символов, используя numpy.random.choice(), выбирая из списка, содержащего заглавные буквы и цифры. Результат затем объединяется в строку с помощью ''.join(a) и выводится на экран.

Для получения дополнительной информации о функции random.choice(), вы можете обратиться к документации NumPy.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь