Генерация случайной строки с заглавными буквами и цифрами
Как мне сгенерировать строку длиной N, состоящую из чисел и заглавных английских букв, таких как:
- 6U1S75
- 4Z4UKK
- U911K4
Пытаюсь понять, как правильно собрать такую строку. Нужен эффективный способ для генерации строк заданной длины, который будет использовать только цифры и заглавные буквы латинского алфавита. Какой подход лучше всего использовать для данной задачи?
5 ответ(ов)
Лучший подход, который можно считать более быстрым, но немного менее случайным, заключается в использовании 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 от шанса получить его в качестве первого символа.
Для генерации случайной строки в нижнем регистре в 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
представляют собой одну и ту же случайную строку, просто в разных регистрах.
Конечно! Вот перевод на русский в стиле ответа на 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
действительно используется, и функция вернёт случайную строку нужной длины. Надеюсь, это поможет!
Этот метод немного быстрее и немного более неудобен, чем метод 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 проигрывает 😉
Наверное, я никогда не стал бы использовать этот подход в рабочем коде, если бы не испытывал неприязни к своим коллегам.
Правка: обновлено в соответствии с вопросом (только заглавные буквы и цифры) и использует битовые операторы & и >> вместо % и //.
Вам нужно использовать функцию 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.
Есть ли в Python метод подстроки 'contains' для строк?
Объединение двух столбцов текста в DataFrame pandas
Как сгенерировать случайную алфавитно-цифровую строку
Как получить имя функции в виде строки?
Вывод строки в текстовый файл