Випадкові рядки в 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

Відповіді:


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 неправильно прочитав думку ОП.
jfs

2
З Python 3.6 це random.choicesбуло б швидше.
IanS

58

Оскільки це запитання досить, е, випадкове, це може підійти вам:

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

6
У багатьох випадках випадкові випадки насправді не потрібні. Швидше, все, що вам насправді потрібно, - це унікальне.
Chase Seibert

1
ви можете використовувати, str(uuid.uuid4())якщо хочете використовувати його як рядок.
Swagatika

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: вибірка більша за сукупність'.
gooithe

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)))
Chris Lutz

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-

жоден з блоків не генерує наступний шаблон символів як рядок

XXXX - XXXX - XXXX - 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.