Altro
Generazione di stringhe casuali con lettere maiuscole e cifre
Voglio generare una stringa di dimensione N.
Dovrebbe essere composta da numeri e lettere inglesi maiuscole come:
- 6U1S75
- 4Z4UKK
- U911K4
Come posso ottenere questo in modo pitonico?
1239
3
Risposta in una riga:
o anche più breve a partire da Python 3.6 usando
random.choices()
:Una versione crittograficamente più sicura; vedere https://stackoverflow.com/a/23728630/2213647:
In dettaglio, con una funzione pulita per un ulteriore riutilizzo:
**Come funziona?
Importiamo
string
, un modulo che contiene sequenze di caratteri ASCII comuni, erandom
, un modulo che si occupa della generazione casuale.string.ascii_uppercase + string.digits
si limita a concatenare la lista di caratteri che rappresentano i caratteri ASCII maiuscoli e le cifre:Poi usiamo una list comprehension per creare una lista di 'n' elementi:
Nell'esempio sopra, usiamo
[
per creare la lista, ma non lo facciamo nella funzioneid_generator
così Python non crea la lista in memoria, ma genera gli elementi al volo, uno per uno (maggiori informazioni su questo qui).Invece di chiedere di creare 'n' volte la stringa
elem
, chiederemo a Python di creare 'n' volte un carattere casuale, scelto da una sequenza di caratteri:Quindi
random.choice(chars) for _ in range(size)
sta davvero creando una sequenza di caratterisize
. Caratteri che sono scelti a caso dachars
:Poi li uniamo semplicemente con una stringa vuota in modo che la sequenza diventi una stringa:
Un modo più semplice, più veloce ma leggermente meno casuale è quello di usare
random.sample
invece di scegliere ogni lettera separatamente, Se sono permesse n-ripetizioni, allargate la vostra base casuale di n volte, ad esempioNota: random.sample impedisce il riutilizzo dei caratteri, moltiplicando la dimensione del set di caratteri si rendono possibili ripetizioni multiple, ma sono ancora meno probabili di quanto lo siano in una scelta casuale pura. Se andiamo per una stringa di lunghezza 6, e scegliamo 'X' come primo carattere, nell'esempio di scelta, le probabilità di ottenere 'X' come secondo carattere sono le stesse di quelle di ottenere 'X' come primo carattere. Nell'implementazione random.sample, le probabilità di ottenere 'X' come qualsiasi carattere successivo sono solo 6/7 delle probabilità di ottenerlo come primo carattere
Pensavo che nessuno avesse ancora risposto a questo lol! Ma ehi, ecco il mio tentativo: