Случайные строки в 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
возможное дублирование случайных строк в Python 2.6 (это нормально?)
Механическая улитка

Ответы:

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
призрачная собака74
источник
Аккуратно! Я сейчас использую это для генератора случайных паролей! Благодарность!
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)
MAK
источник
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']
>>> 

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

Spouk
источник
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