Случайные строки в Python


96

Как создать случайную строку в Python?

Мне нужно, чтобы это было число, а затем повторение символа, пока вы не закончите, это то, что я создал

def random_id(length):
    number = '0123456789'
    alpha = 'abcdefghijklmnopqrstuvwxyz'
    id = ''
    for i in range(0,length,2):
        id += random.choice(number)
        id += random.choice(alpha)
    return id

Будьте более конкретными, приведите несколько примеров того, что вы ищете.
sberry 08

Ответы:


224

Создание строк из (например) символов нижнего регистра:

import random, string

def randomword(length):
   letters = string.ascii_lowercase
   return ''.join(random.choice(letters) for i in range(length))

Полученные результаты:

>>> randomword(10)
'vxnxikmhdc'
>>> randomword(10)
'ytqhdohksy'

3
Лучший ответ на данный момент. Хотя я бы использовал randomword(length, source_alpha=string.lowercase)и xrange(length).
Hank Gay

1
Обратите внимание: хотя это очень хороший ответ, OP изменил вопрос, чтобы сделать его недействительным. И дать свой ответ.
Блэр Конрад

29
Для совместимости с Python 3 используйтеstring.ascii_lowercase
dogwynn

@BlairConrad: Я бы сказал, что вопрос был слишком широким, например, он os.urandom(length)отвечает на исходный вопрос, а @sth неправильно прочитал мысли OP.
jfs

2
С Python 3.6 random.choicesбудет быстрее.
IanS

59

Поскольку этот вопрос довольно, ммм, случайный, это может сработать для вас:

>>> import uuid
>>> print uuid.uuid4()
58fe9784-f60a-42bc-aa94-eb8f1a7e5c17

6
Во многих случаях случайный выбор действительно не требуется. Скорее, все, что вам действительно нужно, уникально.
Чейз Зайберт

1
вы можете использовать, str(uuid.uuid4())если хотите использовать его как строку.
Swagatika 03

2
str(uuid.uuid4()).split("-")[0]Выход:'4bcb6450'
Влад Гулин

Хорошее замечание, Влад. Для чего-то большего, '.join (str (uuid.uuid4 ()). Split (' - ')) также работает. Вывод: '00db8a458c71415c9a263ff08667dd93'
Брэндон

35
>>> import random
>>> import string
>>> s=string.lowercase+string.digits
>>> ''.join(random.sample(s,10))
'jw72qidagk

Аккуратно! Я сейчас использую это для генератора случайных паролей! Благодарность!
Chandsie

13
random.sample будет отбирать уникальные символы из s, т.е. символы в пароле никогда не будут повторяться. Это значительно менее безопасно, чем использование random.choice в принятом ответе.
Ник Залуцкий

3
@NickZalutskiy: random.choiceтоже небезопасно. Используйте random.SystemRandom().choice()или используйте os.urandom()напрямую .
jfs

1
ПРЕДУПРЕЖДЕНИЕ! примите к сведению два комментария выше. random.sample возвращает уникальные образцы. символы не повторяются. поэтому возвращаемая строка менее случайна. Ошибка для больших строк: «ValueError: выборка больше, чем совокупность».
gaoithe

1
В Python 3 lowercaseследует заменить наascii_lowercase
Attaque

18

Ответ на исходный вопрос:

os.urandom(n)

Цитата: http://docs.python.org/2/library/os.html

Вернуть строку из n случайных байтов, подходящую для криптографического использования.

Эта функция возвращает случайные байты из источника случайности, зависящего от ОС. Возвращаемые данные должны быть достаточно непредсказуемыми для криптографических приложений, хотя их точное качество зависит от реализации ОС. В UNIX-подобной системе будет запрашиваться / dev / urandom, а в Windows - CryptGenRandom. Если источник случайности не найден, будет вызвана ошибка NotImplementedError.

Для простого в использовании интерфейса к генератору случайных чисел, предоставляемому вашей платформой, см. Random.SystemRandom.


5

Вы можете создавать случайные символы ascii, например:

import random
print chr(random.randint(0,255))

А затем создайте более длинную строку, например:

len = 50
print ''.join( [chr(random.randint(0,255)) for i in xrange(0,len)] )

1
Зачем использовать форматирование строк? ''.join(map(chr, random.randint(0,256) for _ in xrange(len)))
Крис Лутц

5

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

Ниже наклеивается очень простое решение.

import random

def randstring(length=10):
    valid_letters='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    return ''.join((random.choice(valid_letters) for i in xrange(length)))

print randstring()
print randstring(20)

fyi, вы можете опустить самый внешний набор скобок в вашем операторе возврата.
рекурсивный

4

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

import random

def randomWord(length=5):
    consonants = "bcdfghjklmnpqrstvwxyz"
    vowels = "aeiou"

    return "".join(random.choice((consonants, vowels)[i%2]) for i in range(length))

Затем,

>>> randomWord()
nibit
>>> randomWord()
piber
>>> randomWord(10)
rubirikiro

Чтобы избежать слов из 4 букв, не устанавливайте lengthзначение 4.

Джим


3
random_name = lambda length: ''.join(random.sample(string.letters, length))

длина должна быть <= len (string.letters) = 53. Пример результата

   >>> [random_name(x) for x in range(1,20)]
['V', 'Rq', 'YtL', 'AmUF', 'loFdS', 'eNpRFy', 'iWFGtDz', 'ZTNgCvLA', 'fjUDXJvMP', 'EBrPcYKUvZ', 'GmxPKCnbfih', 'nSiNmCRktdWZ', 'VWKSsGwlBeXUr', 'i
stIFGTUlZqnav', 'bqfwgBhyTJMUEzF', 'VLXlPiQnhptZyoHq', 'BXWATvwLCUcVesFfk', 'jLngHmTBtoOSsQlezV', 'JOUhklIwDBMFzrTCPub']
>>> 

Наслаждаться. ;)



1

В python3.6+вы можете использовать secretsмодуль :

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

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

При тестировании генерации 768bitтокенов безопасности я обнаружил:

  • random.choices()- 0.000246секунды
  • secrets.choice()- 0.003529секунды

Эти secretsмодули медленнее , но за пределами тестирования является то , что вы должны использовать для криптографических целей:

import string, secrets

def random_string(size):        
        letters = string.ascii_lowercase+string.ascii_uppercase+string.digits            
        return ''.join(secrets.choice(letters) for i in range(size))

print(random_string(768))

0

Эта функция генерирует случайную строку, состоящую из прописных и строчных букв, цифр, передает разделитель длины, no_of_blocks, чтобы указать формат вашей строки

например: len_sep = 4, no_of_blocks = 4 сгенерирует следующий шаблон,

F4nQ-Vh5z-JKEC-WhuS

Где разделитель длины добавит "-" после 4 символов.

XXXX-

ни один из блоков не сгенерирует следующий набор символов в виде строки

ХХХХ - ХХХХ - ХХХХ - ХХХХ

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

например: len_sep = 10, no_of_blocks = 1, сгенерирует следующий шаблон, т.е. случайная строка длиной 10 ,

F01xgCdoDU

import random as r

def generate_random_string(len_sep, no_of_blocks):
    random_string = ''
    random_str_seq = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    for i in range(0,len_sep*no_of_blocks):
        if i % len_sep == 0 and i != 0:
            random_string += '-'
        random_string += str(random_str_seq[r.randint(0, len(random_str_seq) - 1)])
    return random_string

0
import random 
import string

def get_random_string(size):
    chars = string.ascii_lowercase+string.ascii_uppercase+string.digits
    ''.join(random.choice(chars) for _ in range(size))

print(get_random_string(20)

вывод: FfxjmkyyLG5HvLeRudDS


-1

попробуйте импортировать указанный ниже пакет из случайного импорта *


Это вообще не решает вопрос. Есть ли лучший (питонический) способ сгенерировать этот шаблон случайным образом
drekbour
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.