Как сгенерировать случайную строку в Python
Случайные строки и числа полезны, когда дело касается безопасности. В информатике предсказуемые объекты менее безопасны, и наоборот, менее предсказуемые элементы более безопасны. Когда мы подписываемся на услуги, нам нужно предоставить пароль. Мы можем использовать эти случайные строки в качестве пароля, который менее предсказуемы и более безопасен.
Python предоставляет несколько пакетов, которые работают со случайной строкой, числами и даже криптографией.
Создать случайную строку в Python
Чтобы сгенерировать случайную строку в Python, используйте модуль строки и метод random.choices().
Строковый модуль в Python содержит различные строковые константы, включая символы ASCII для всех случаев. Он также включает отдельные константы для прописных и строчных букв, цифр и специальных символов.
Модуль random в Python выполняет случайные генерации.
import random import string def generate_random_string(length): letters = string.ascii_lowercase rand_string = ''.join(random.choice(letters) for i in range(length)) print("Random string of length", length, "is:", rand_string) generate_random_string(8)
Random string of length 8 is: nwmqqxyf
В этом примере мы генерируем случайную строку на основе длины, которую мы передаем функции.
Внутри функции мы сгенерировали случайную строку с комбинацией нижнего регистра, а затем использовали константу string.ascii_letters. Константа string.ascii_letters включает все строчные и прописные буквы.
Чтобы сгенерировать строку со всеми строчными буквами, используйте свойство string.ascii_lowercase.
На следующем шаге запустите цикл for n количество раз, что является длиной строки, чтобы выбрать один символ из строковой константы с помощью метода random.choice(), присоединить его к строковой переменной и использовать join( ) для формирования случайной строки.
Давайте передадим 16 в качестве длины, и он сгенерирует случайную строку длиной 16 символов.
import random import string def generate_random_string(length): letters = string.ascii_lowercase rand_string = ''.join(random.choice(letters) for i in range(length)) print("Random string of length", length, "is:", rand_string) generate_random_string(16)
Random string of length 16 is: oxepenikhgjmhknp
Сгенерировать случайную строку с прописными буквами
Чтобы сгенерировать строку со всеми прописными буквами, используйте свойство string.ascii_uppercase.
import random import string def generate_random_string(length): letters = string.ascii_uppercase rand_string = ''.join(random.choice(letters) for i in range(length)) print("Random string of length", length, "is:", rand_string) generate_random_string(16)
Random string of length 16 is: MAWNYZRAVTHHGUVX
Каждый раз, когда вы запускаете файл, вы будете получать разные результаты.
Генерация случайной строки только из определенных букв
Вы можете сгенерировать случайную строку только из определенных букв, вместо записи строки .ascii_uppercase, здесь вам нужно написать конкретную строку, из которой вам нужно сгенерировать случайную строку.
Кроме того, вам не нужен строковый модуль Python, потому что мы используем определенную строку.
import random def generate_random_string(length): letters = 'bobbyelevenmilliehopperjane' rand_string = ''.join(random.choice(letters) for i in range(length)) print("Random string of length", length, "is:", rand_string) generate_random_string(16)
Random string of length 16 is: leerljlbvmpelony
Вы можете видеть, что все буквы взяты из предоставленной строки.
Создать случайную строку без повторяющихся символов
Функция random.choice() может принимать повторяющиеся символы, но метод random.sample() не может принимать повторяющиеся символы, поэтому мы можем использовать метод random.sample() для генерации случайной строки.
import random import string def generate_random_string(length): letters = string.ascii_lowercase rand_string = ''.join(random.sample(letters, length)) print("Random string of length", length, "is:", rand_string) generate_random_string(16)
Random string of length 16 is: gvekicdsfmrxbuyj
Создать случайную буквенно-цифровую строку в Python
Чтобы сгенерировать буквенно-цифровую случайную строку в Python, используйте константы string.ascii_letters и string.digits, чтобы получить комбинации букв и цифр.
import random import string def generate_alphanum_random_string(length): letters_and_digits = string.ascii_letters + string.digits rand_string = ''.join(random.sample(letters_and_digits, length)) print("Alphanum Random string of length", length, "is:", rand_string) generate_alphanum_random_string(16)
Alphanum Random string of length 16 is: n7b1K3wavxXrDdjO
Использование secrets.choice()
Python предоставляет пакет secrets для генерации криптографически более безопасных случайных чисел. У метода secrets.choice() есть внутренний алгоритм, построенный таким образом, что он генерирует менее предсказуемые случайные числа.
import secrets import string def generate_alphanum_crypt_string(length): letters_and_digits = string.ascii_letters + string.digits crypt_rand_string = ''.join(secrets.choice( letters_and_digits) for i in range(length)) print("Cryptic Random string of length", length, "is:", crypt_rand_string) generate_alphanum_crypt_string(16)
Cryptic Random string of length 16 is: Pq9hga3IyExXKVhX
Генератор рандомных слов на русском
Я предлагаю хранить слова локально, в txt файле (в таком виде их проще всего добыть) Соответственно код:
with open('dict.txt', 'r') as file: words = file.readlines(). words = [s.strip("\n") for s in words]
Пишем генератор случайного слова
import random def random_word(words): return random.choice (words)
Переводите этот запрос на нужный вам язык при помощи Google Translator и в выдаче один из первых сайтов будет содержать нужную вам информацию Так же если вы не можете найти список слов в открытом доступе, или не можете его использовать по корпоративным соображениям, список слов можно легко спарсерить например с википедии, или другого веб-сайта. На нужном языке открывается 1000-3000 страниц и все слова, которых еще нет в словарике добавляются. Вся эта процедура займёт пару часов, но у вас будет хоть неполный, но достаточный для рандомной генерации слов словарик.
Генератор текста на основе триграмм (python)
В данной статье описывается как сгенерировать псевдотекст на основе триграммной модели. Полученный текст вряд ли возможно где-либо использовать, тем не менее это неплохая иллюстрация использования статистических методов обработки естественного языка. Пример работы генератора можно посмотреть здесь.
Сухая теория
И так, наша задача сгенерировать текст. Это значит, нам нужно взять слова и выстроить их в определенном порядке. Как определить этот порядок? Мы можем пойти следующим образом: построить фразы, наиболее вероятные для русского языка. Но что значит вероятность фразы языка? С точки зрения здравого смысла это бред. Тем не менее, эту вероятность можно задать формально как вероятность возникновения последовательности слов в неком корпусе (наборе текстов). К примеру, вероятность фразы «счастье есть удовольствие без раскаяния» можно вычислить как произведение вероятностей каждого из слов этой фразы:
P = P(счастье) P(есть|счастье) P(удовольствие|счастье есть) P(без|счастье есть удовольствие) P(раскаяния|счастье есть удовольствие без)
Рассчитать вероятность P(счастье) дело нехитрое: нужно всего лишь посчитать сколько раз это слово встретилось в тексте и поделить это значение на общее число слов. Но рассчитать вероятность P(раскаяния|счастье есть удовольствие без) уже не так просто. К счастью, мы можем упростить эту задачу. Примем, что вероятность слова в тексте зависит только от предыдущего слова. Тогда наша формула для расчета фразы примет следующий вид:
P = P(счастье) P(есть|счастье) P(удовольствие|есть) P(без|удовольствие) P(раскаяния|без)
Уже проще. Рассчитать условную вероятность P(есть|счастье) несложно. Для этого считаем количество пар ‘счастье есть’ и делим на количество в тексте слова ‘счастье’:
P(есть|счастье) = C(счастье есть)/С(счастье)
В результате, если мы посчитаем все пары слов в некотором тексте, мы сможем вычислить вероятность произвольной фразы. А если мы сможем вычислить вероятность фразы, мы можем подобрать наиболее «правдоподобные» сочетания слов в данном тексте для автоматической генерации. Кстати, эти пары слов называются биграммы, а набор рассчитанных вероятностей — биграммной моделью.
Хочу отметить, что для нашего алгоритма мы используем не биграммы, а триграммы. Отличие в том, что условная вероятность слова определяется не по одному, а по двум предыдущим словам. То есть вместо P(удовольствие|счастье) мы будем вычислять P(удовольствие|счастье есть). Формула вычисления подобна формуле для биграмм:
P(удовольствие|счастье есть) = C(счастье есть удовольствие)/С(счастье есть)
Итак, генерацию текста можно провести следующим образом. Мы будем формировать отдельно каждое предложение, выполняя следующие шаги:
* выбираем слово, наиболее вероятное для начала предложения;
* подбираем наиболее вероятное слово-продолжение в зависимости от двух предыдущих слов;
* повторяем предыдущий шаг до тех пор, пока не встретим символ конца предложения.
Практика
Для начала, нам нужно подготовить корпус, на котором мы будем тренировать свою модель. Я, к примеру, взял выборку из Льва Толстого на сайте lib.ru, и сформировал один текстовый файл (скачать можно здесь).
Из данного текста выделим необходимую нам последовательность слов.
import re
r_alphabet = re . compile( u'[а-яА-Я0-9-]+|[. ;?!]+’ )
def gen_lines (corpus):
data = open (corpus)
for line in data:
yield line . decode( ‘utf-8’ ) . lower()
def gen_tokens (lines):
for line in lines:
for token in r_alphabet . findall(line):
yield token
lines = gen_lines( ‘tolstoy.txt’ )
tokens = gen_tokens(lines)
Получившийся генератор tokens будет выдавать «очищенную» последовательность слов и знаков препинания. Однако, простая последовательность нам не интересна. Нам интересны тройки токенов (под токеном здесь понимается слово или знак препинания, т.е. некие атомарные элементы текста). Для этого добавим еще один генератор, на выходе которого будем иметь три подряд идущих токена.
import re
r_alphabet = re . compile( u'[а-яА-Я0-9-]+|[. ;?!]+’ )
def gen_lines (corpus):
data = open (corpus)
for line in data:
yield line . decode( ‘utf-8’ ) . lower()
def gen_tokens (lines):
for line in lines:
for token in r_alphabet . findall(line):
yield token
def gen_trigrams (tokens):
t0, t1 = ‘$’ , ‘$’
for t2 in tokens:
yield t0, t1, t2
if t2 in ‘. ‘ :
yield t1, t2, ‘$’
yield t2, ‘$’ , ‘$’
t0, t1 = ‘$’ , ‘$’
else :
t0, t1 = t1, t2
lines = gen_lines( ‘tolstoy.txt’ )
tokens = gen_tokens(lines)
trigrams = gen_trigrams(tokens)
Метод gen_trigrams требует пояснения. Символы ‘$’ используются для маркировки начала предложения. В дальнейшем, это делает проще выбор первого слова генерируемой фразы. В целом, метод действует следующим образом: он возвращает три подряд идущих токена, на каждой итерации сдвигаясь на один токен:
На входе:
‘Счастье есть удовольствие без раскаяния’
На выходе:
итерация токены
0: $ $ счастье
1: $ счастье есть
2: счастье есть удовольствие
3: есть удовольствие без
…
Далее, рассчитаем триграммную модель:
import re
from collections import defaultdict
r_alphabet = re . compile( u'[а-яА-Я0-9-]+|[. ;?!]+’ )
def train (corpus):
lines = gen_lines(corpus)
tokens = gen_tokens(lines)
trigrams = gen_trigrams(tokens)
bi, tri = defaultdict( lambda : 0.0 ), defaultdict( lambda : 0.0 )
for t0, t1, t2 in trigrams:
bi[t0, t1] += 1
tri[t0, t1, t2] += 1
model = <>
for (t0, t1, t2), freq in tri . iteritems():
if (t0, t1) in model:
model[t0, t1] . append((t2, freq / bi[t0, t1]))
else :
model[t0, t1] = [(t2, freq / bi[t0, t1])]
return model
В первой части этого метода мы задаем генераторы. Далее, рассчитываем биграммы и триграммы (фактически, мы считаем количество одинаковых пар и троек слов в тексте). Далее, вычисляем вероятность слова в зависимости от двух предыдущих, помещая данное слово и его вероятность в словарь. Надо сказать, что это не самый оптимальный метод, так как идет значительный расход памяти. Но для небольших корпусов этого вполне достаточно.
Теперь у нас все готово для генерации текста. Следующая функция возвращает предложение.
model = train( ‘tolstoy.txt’ )
def generate_sentence (model):
phrase = »
t0, t1 = ‘$’ , ‘$’
while 1 :
t0, t1 = t1, unirand(model[t0, t1])
if t1 == ‘$’ : break
if t1 in ( ‘. ;:’ ) or t0 == ‘$’ :
phrase += t1
else :
phrase += ‘ ‘ + t1
return phrase . capitalize()
Суть метода в том, что мы последовательно выбираем наиболее вероятные слова или знаки препинания до тех пор, пока не встречаем признак начала следующей фразы (символа $). Первое слово выбирается как наиболее вероятное для начала предложения из набора model[‘$’, ‘$’].
Здесь необходимо отметить важный момент. Словарь model для каждой пары слов содержит список пар (слово, вероятность). Нам же необходимо выбрать из этого набора только одно слово. Вариант «в лоб» — выбрать слово с максимальной вероятностью. Но тогда все сгенерированные фразы были бы похожи друг на друга. Более подходящий способ способ — выбирать слова с некой хаотичностью, которая бы зависела от вероятности слова (мы же не хотим чтобы наши фразы состояли из редких сочетаний). Это и делает метод unirand, который возвращает случайное слово с вероятностью, равной вероятности данного слова в зависимости от двух предыдущих.
Итого, полный код нашего генератора выглядит следующим образом:
import re
from random import uniform
from collections import defaultdict
r_alphabet = re . compile( u'[а-яА-Я0-9-]+|[. ;?!]+’ )
def gen_lines (corpus):
data = open (corpus)
for line in data:
yield line . decode( ‘utf-8’ ) . lower()
def gen_tokens (lines):
for line in lines:
for token in r_alphabet . findall(line):
yield token
def gen_trigrams (tokens):
t0, t1 = ‘$’ , ‘$’
for t2 in tokens:
yield t0, t1, t2
if t2 in ‘. ‘ :
yield t1, t2, ‘$’
yield t2, ‘$’ , ‘$’
t0, t1 = ‘$’ , ‘$’
else :
t0, t1 = t1, t2
def train (corpus):
lines = gen_lines(corpus)
tokens = gen_tokens(lines)
trigrams = gen_trigrams(tokens)
bi, tri = defaultdict( lambda : 0.0 ), defaultdict( lambda : 0.0 )
for t0, t1, t2 in trigrams:
bi[t0, t1] += 1
tri[t0, t1, t2] += 1
model = <>
for (t0, t1, t2), freq in tri . iteritems():
if (t0, t1) in model:
model[t0, t1] . append((t2, freq / bi[t0, t1]))
else :
model[t0, t1] = [(t2, freq / bi[t0, t1])]
return model
def generate_sentence (model):
phrase = »
t0, t1 = ‘$’ , ‘$’
while 1 :
t0, t1 = t1, unirand(model[t0, t1])
if t1 == ‘$’ : break
if t1 in ( ‘. ;:’ ) or t0 == ‘$’ :
phrase += t1
else :
phrase += ‘ ‘ + t1
return phrase . capitalize()
def unirand (seq):
sum_, freq_ = 0 , 0
for item, freq in seq:
sum_ += freq
rnd = uniform( 0 , sum_)
for token, freq in seq:
freq_ += freq
if rnd < freq_:
return token
if __name__ == ‘__main__’ :
model = train( ‘tolstoy.txt’ )
for i in range ( 10 ):
print generate_sentence(model),
Отлично, вы добрались до конца. Завидую вашему терпению :).
Почему триграммы
Триграммная модель выбрана для простоты и наглядности. Биграммы давали бы плохой результат, в то время как 4-граммы требовали бы существенно больше ресурсов. В любом случае, довольно просто расширить данный алгоритм для обработки общего случая N-грамм. Однако стоит учесть, что чем больше N, тем больше ваш текст похож на исходный корпус.
- python
- text processing
Генератор случайных слов
Нужно сгенерировать слово из 5 английский букв
На плюсах знаю как это сделаться в питоне как это можно решить?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Создать генератор случайных слов из текста
Задание: Создать генератор случайных слов из текста(а текст находится например в файле) на Python.

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

Генератор случайных чисел
Добрый день, друзья :)! Подскажите, пожалуйста. в учебнике программа есть такая, но у меня не.
![]()
7279 / 4102 / 1794
Регистрация: 27.03.2020
Сообщений: 6,926
lee3112,
1 2 3
from string import ascii_lowercase from random import sample print(''.join(sample(ascii_lowercase, 5)).capitalize())
