Mai mult
Șir aleatoriu de generare cu majuscule și cifre
Vreau pentru a genera un șir de caractere de dimensiune N.
Ar trebui să fie format din numere și litere mari litere limba engleză, cum ar fi:
- 6U1S75
- 4Z4UKK
- U911K4
Cum pot realiza acest lucru într-un pythonic mod?
1239
27
Răspunde într-o singură linie:
sau chiar mai scurte începând cu Python 3.6 folosind
aleatoare.alegeri()
:O criptografice versiune mai sigură; a se vedea https://stackoverflow.com/a/23728630/2213647:
În detalii, cu o funcție pentru reutilizare ulterioară:
Cum funcționează ?
Noi de import
string
, un modul care conține secvențe de comun caractere ASCII, și "aleatorie", un modul care se ocupa cu generarea aleatoare.`string.ascii_uppercase + string.cifre doar concateneaza lista de caractere reprezentând majuscule ASCII caractere și cifre:
Apoi vom folosi o listă de înțelegere pentru a crea o listă de 'n' elemente:
În exemplul de mai sus, vom folosi
[
pentru a crea lista, dar nu ne't în `id_generator funcția Python nu't crea lista din memorie, dar generează elementele pe zbor, unul câte unul (mai multe despre acest aici).În loc de a cere pentru a crea 'n' ori șirul
elem
, vom cere Python pentru a crea 'n' ori un caracter aleatoriu, ales dintr-o secvență de caractere:Prin urmare aleatorie.alegerea(caractere) pentru _ în intervalul(dimensiune)
într-adevăr este de a crea o secvență de "dimensiune" de caractere. Personaje care sunt culese la întâmplare din
chars`:Atunci ne vom alătura lor cu un șir gol astfel încât secvența devine un șir de caractere:
Acest Stack Overflow quesion este actualul top Google rezultat pentru "șir aleator Python". Actualul top răspunsul este:
Aceasta este o metodă excelentă, dar PRNG în mod aleatoriu nu este criptografice sigure. Presupun că mulți oameni cercetarea la această întrebare va dori pentru a genera aleatoriu siruri de caractere pentru criptare sau parole. Puteți face acest lucru în siguranță, de a face o mică schimbare în codul de mai sus:
Folosind aleatorie.SystemRandom()
în loc de doar o întâmplare foloseste /dev/urandom pe *nix mașini și
CryptGenRandom()` din Windows. Acestea sunt criptografice sigure PRNGs. Folosind aleatorie.alegerea "în loc de" aleatoare.SystemRandom().alegerea într-o aplicație care necesită o secure PRNG ar putea fi devastatoare, și având în vedere popularitatea de această întrebare, pun pariu că greșeala a fost făcută de mai multe ori deja.Daca're folosind python3.6 sau mai sus, puteți folosi noua secrete modul cum se menționează în MSeifert's a răspunde:
Modulul docs discuta, de asemenea, convenabil moduri de a a genera jetoane sigure și cele mai bune practici.
Pur și simplu utilizați Python's built-uuid:
Dacă Uuid-urile sunt ok pentru scopurile tale, utilizați built-in uuid pachet.
O Soluție Linie:
import uuid; uuid.uuid4().hex.upper()[0:6]
În Profunzime Versiune:
Exemplu:
Dacă aveți nevoie de exact formatul (de exemplu, "6U1S75"), o poti face astfel:
Mai simplu, mai rapid, dar mai puțin aleatoare mod este de a utiliza aleatorie.proba` în loc de a alege fiecare literă separat, Dacă n-repetiții sunt permise, extindeți dvs. și aleatoriu de n ori, de exemplu
Notă: aleatoare.proba previne caracter reutilizare, înmulțirea dimensiunea setului de caractere face mai multe repetari posibile, dar ele sunt mai puțin probabil, atunci ele sunt într-o pură întâmplare alegere. Dacă mergem pentru un șir de lungime 6, și vom alege 'X' ca primul caracter, în alegerea exemplu, șansele de a obține 'X' pentru cel de-al doilea personaj sunt aceleași ca și șansele de a obține 'X' ca primul caracter. În mod aleatoriu.exemplu de implementare, șansele de a obține 'X' ca orice caracter ulterioară sunt doar 6/7 șansa de a obține-l ca primul caracter
lowercase_str
este o valoare aleatoare ca'cea8b32e00934aaea8c005a35d85a5c0'
uppercase_str "este" 'CEA8B32E00934AAEA8C005A35D85A5C0'
Un mod mai rapid, mai ușor și mai flexibil mod de a face acest lucru este de a utiliza
strgen
modulul (pip instala StringGenerator
).Genera un 6 caractere aleatoare șir cu litere majuscule și cifre:
Obține o listă unică:
Guarantee unul "speciale" caracter din șir:
O întâmplare de culoare HTML:
etc.
Trebuie să fim conștienți de faptul că acest lucru:
s-ar putea să nu aibă o cifră (sau majusculă) în ea.
strgen
este mai rapid în producător-time, decât oricare dintre soluțiile de mai sus. Soluția de Ignacio este cel mai rapid run-time performante și este răspunsul corect utilizând Biblioteca Standard Python. Dar, niciodata nu se va folosi în această formă. Veți dori să utilizați SystemRandom (sau de rezervă, dacă nu sunt disponibile), asigurați-vă că este necesar seturi de caractere sunt reprezentate, utilizarea unicode (sau nu), asigurați-vă că succesive invocații produce un șir unic, utilizați un subset de un șir de module clase de caractere, etc. Toate acestea necesită o mulțime mai mult cod decât în răspunsurile oferite. Diferitele încercări de a generaliza o soluție de avea limitări care strgen rezolvă cu o mai mare concizie și putere expresivă, folosind un model simplu limba.L's pe PyPI:
Dezvăluire: am'm autorul strgen module.
De Python 3.6 pe tine ar trebui să utilizeze "secrete" modul if ai nevoie de ea pentru a fi criptografice secure în loc de "aleator" module (în caz contrar, acest răspuns este identică cu cea de @Ignacio Vazquez-Abrams):
O notă suplimentară: o listă de înțelegere este mai rapid în cazul din str.alătură-te decât cu ajutorul unui generator de exprimare!
Bazat pe un alt Teanc de Preaplin răspuns, cel Mai ușor mod de a crea un șir aleator și aleatoriu un număr hexazecimal, o versiune mai bună decât a acceptat răspunsul ar fi:
mult mai rapid.
Am crezut că nimeni nu a răspuns încă lol! Dar hei, aici's propria mea du-te la ea:
Dacă aveți nevoie de un șir aleator mai degrabă decât un pseudo-aleatoare o, ar trebui să utilizați
os.urandom
ca sursăAceastă metodă este ușor mai rapid, și ușor mai enervant, decât întâmplător.alegerea() metoda Ignacio postat.
Profită de natura pseudo-aleatoare algoritmi, și băncile la nivel de bit și și schimbare fiind mai rapidă decât a genera un nou număr aleator pentru fiecare personaj.
...de a crea un generator care are 5 biți numere la un moment dat 0..31 până când nimeni nu a plecat
...join() rezultatele generator pe un număr aleator cu dreptul de biți
Cu Datănu, pentru 32 de caractere, siruri de caractere, momentul a fost:
...dar pentru 64 de șiruri de caractere, randbits pierde ;)
Probabil că m-aș folosi niciodată această abordare în codul de producție dacă nu-mi plăcea să-mi co-lucrătorilor.
edit: actualizat pentru a se potrivi întrebare (majuscule și cifre numai), și de a folosi operatori la nivel de bit & și >> în loc de a % și //
Am'd face în acest fel:
Sau doar:
Utilizarea Numpy's întâmplare.alegerea() funcția
Documentația este aici http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.random.choice.html
următoarele logica generează încă 6 caractere eșantion aleatoriu
Nu este nevoie pentru a se multiplica de 6
Uneori 0 (zero) & O (litera O) poate fi confuz. Asa ca am folosi
Pentru cei dintre voi care se bucura funcționale python:
Acesta generează o durată nedeterminată [infinit] iterator, de s-au alăturat secvențe aleatoare, de prima genera o durată nedeterminată secvență de selectate aleatoriu simbol din oferindu-exterioară, apoi de rupere această secvență în părți, care este apoi s-au alăturat, ar trebui să funcționeze cu orice secvență care acceptă getitem, implicit, pur și simplu generează o secvență aleatoare de alfa numerice litere, deși puteți modifica cu ușurință pentru a genera alte lucruri:
de exemplu, pentru a genera aleatoriu tupluri de cifre:
dacă tu nu't doriți să utilizați în continuare pentru generarea puteți face pur și simplu nevărsat:
dacă doriți pentru a genera secvența de pe zbor, pur și simplu setați adere la identitate.
Cum alții au menționat dacă aveți nevoie de mai multă securitate, apoi setați corespunzător selectați funcția:
implicit selector este
alegere
, care poate selecta același simbol de mai multe ori pentru fiecare parte, dacă în loc să te'd vrem același membru selectat cel mult o dată pentru fiecare bucată apoi, într-o posibilă utilizare:vom folosi
sample
nostru selector, pentru a face o selecție completă, astfel încât bucăți sunt, de fapt, lungime 1, și să se alăture pur și simplu apel "next" care preia următorul complet generat bucată, acordat acest exemplu pare un pic greoaie și este ...(1) Acest lucru vă va oferi toate capacele și numere:
(2) Dacă doriți mai târziu să includă litere mici în cheia ta, atunci acest lucru va lucra, de asemenea,:
aceasta este o ia pe Anurag Uniyal 's de răspuns și ceva ce am fost de lucru pe mine însumi.
Aici lungime de șir poate fi schimbat în buclă pentru am.e pentru că în intervalul(1,lungime) Este algoritm simplu, care este ușor de înțeles. folosește listă astfel încât vă puteți debarasa de caractere care nu aveți nevoie.
La aleatorie.alegerea funcția alege o intrare aleatoare într-o listă. Ai, de asemenea, de a crea o listă, astfel încât să puteți adăuga personajul din "pentru" declarație. La sfârșitul str ['t', 'm', '2', 'J', 'U', 'Q', '0', '4', 'C', 'K'], dar
str = "".alăturați-vă(str)
are grijă de faptul că, lăsându-vă cu'tm2JUQ04CK'
.Sper că acest lucru vă ajută!