Stringhe casuali in Python


96

Come crei una stringa casuale in Python?

Avevo bisogno che fosse un numero e poi il personaggio si ripetesse finché non hai finito, questo è ciò che ho creato

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

Sii più specifico, fornisci alcuni esempi di ciò che stai cercando.
sberry

Risposte:


223

Generazione di stringhe da (ad esempio) caratteri minuscoli:

import random, string

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

Risultati:

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

3
La migliore risposta finora. Io userei randomword(length, source_alpha=string.lowercase)e xrange(length), però.
Hank Gay

1
Si noti che sebbene questa sia un'ottima risposta, l'OP ha modificato la domanda per invalidarla. E per fornire la propria risposta.
Blair Conrad

29
Per la compatibilità con Python 3, usastring.ascii_lowercase
dogwynn

@ BlairConrad: direi che la domanda era troppo ampia, ad esempio os.urandom(length)risponde alla domanda originale e @sth ha letto la mente di OP in modo errato.
jfs

1
Da Python 3.6, random.choicessarebbe più veloce.
IanS

58

Poiché questa domanda è abbastanza, uh, casuale, potrebbe funzionare per te:

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

6
In molti casi, casuale non è realmente richiesto. Piuttosto, tutto ciò di cui hai veramente bisogno è unico.
Chase Seibert

1
potresti usarlo str(uuid.uuid4())se vuoi usarlo come una stringa.
Swagatika

2
str(uuid.uuid4()).split("-")[0]Uscita:'4bcb6450'
Vlad Gulin

Buon punto, Vlad. Per qualcosa di più lungo, funziona anche ".join (str (uuid.uuid4 ()). Split ('-')). Uscita: "00db8a458c71415c9a263ff08667dd93"
Brandon

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

Neat! In realtà lo sto usando per un generatore di password casuali ora! Grazie!
chandsie

13
random.sample campionerà caratteri univoci da s, cioè i caratteri nella password non si ripeteranno mai. Questo è considerevolmente meno sicuro rispetto all'utilizzo di random.choice come nella risposta accettata.
Nick Zalutskiy

3
@NickZalutskiy: random.choicenon è neanche sicuro. Usa random.SystemRandom().choice()o usa os.urandom()direttamente .
jfs

1
AVVERTIMENTO! prendere nota di due commenti sopra. random.sample restituisce campioni unici. i caratteri non vengono ripetuti. quindi la stringa restituita è meno casuale. Per stringhe più grandi, errore: "ValueError: sample più grande della popolazione".
gaoithe

1
In Python 3, lowercasedovrebbe essere sostituito conascii_lowercase
Attaque

18

Risposta alla domanda originale:

os.urandom(n)

Citazione da: http://docs.python.org/2/library/os.html

Restituisce una stringa di n byte casuali adatta per l'uso crittografico.

Questa funzione restituisce byte casuali da un'origine di casualità specifica del sistema operativo. I dati restituiti dovrebbero essere abbastanza imprevedibili per le applicazioni crittografiche, sebbene la loro esatta qualità dipenda dall'implementazione del sistema operativo. Su un sistema simile a UNIX questo interrogherà / dev / urandom, e su Windows userà CryptGenRandom. Se non viene trovata una fonte di casualità, verrà sollevata NotImplementedError.

Per un'interfaccia facile da usare al generatore di numeri casuali fornito dalla tua piattaforma, vedi random.SystemRandom.


5

Puoi creare caratteri ASCII casuali come:

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

E poi crea una stringa più lunga come:

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

1
Perché utilizzare la formattazione delle stringhe? ''.join(map(chr, random.randint(0,256) for _ in xrange(len)))
Chris Lutz

5

Non hai davvero detto molto sul tipo di stringa casuale di cui hai bisogno. Ma in ogni caso, dovresti esaminare il randommodulo.

Una soluzione molto semplice è incollata di seguito.

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)

Cordiali saluti, puoi omettere il set di parentesi più esterno nella dichiarazione di reso.
ricorsivo

4

A volte, ho voluto stringhe casuali che fossero semi-pronunciabili, semi-memorabili.

import random

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

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

Poi,

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

Per evitare parole di 4 lettere, non impostare lengthsu 4.

Jim


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

la lunghezza deve essere <= len (string.letters) = 53. esempio di risultato

   >>> [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']
>>> 

Godere. ;)



0

Questa funzione genera una stringa casuale composta da lettere maiuscole, minuscole, cifre, passa il separatore di lunghezza, no_of_blocks per specificare il formato della stringa

ad esempio: len_sep = 4, no_of_blocks = 4 genererà il seguente modello,

F4nQ-Vh5z-JKEC-WhuS

Dove, il separatore di lunghezza aggiungerà "-" dopo 4 caratteri

XXXX-

numero di blocchi genererà il seguente schema di caratteri come stringa

XXXX - XXXX - XXXX - XXXX

se è necessaria una singola stringa casuale, mantenere la variabile no_of_blocks uguale a 1 e len_sep per specificare la lunghezza della stringa casuale.

es: len_sep = 10, no_of_blocks = 1, genererà il seguente modello es. stringa casuale di lunghezza 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)

uscita: FfxjmkyyLG5HvLeRudDS


0

In python3.6+puoi usare il secretsmodulo :

Il modulo segreti viene utilizzato per generare numeri casuali crittograficamente forti adatti per la gestione di dati come password, autenticazione dell'account, token di sicurezza e segreti correlati.

In particolare, i segreti dovrebbero essere usati di preferenza rispetto al generatore di numeri pseudo-casuali predefinito nel modulo casuale, che è progettato per la modellazione e la simulazione, non per la sicurezza o la crittografia.

Durante il test della generazione di 768bittoken di sicurezza ho trovato:

  • random.choices()- 0.000246sec
  • secrets.choice()- 0.003529sec

I secretsmoduli sono più lenti ma al di fuori dei test è quello che dovresti usare per scopi crittografici:

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

-1

prova a importare il pacchetto seguente dall'importazione casuale *


Questo non risolve affatto la domanda. C'è un modo migliore (pitonico) per generare questo modello casuale
drekbour
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.