Tilfeldig strenggenerering med store bokstaver og sifre
Jeg vil generere en streng av størrelse N.
Den skal bestå av tall og store engelske bokstaver som f.eks:
- 6U1S75
- 4Z4UKK
- U911K4
Hvordan kan jeg oppnå dette på en pytonisk måte?
1239
3
Svar på én linje:
eller enda kortere med Python 3.6 ved hjelp av
random.choices()
:En kryptografisk sikrere versjon; se https://stackoverflow.com/a/23728630/2213647:
I detaljer, med en ren funksjon for videre gjenbruk:
Hvordan fungerer det?
Vi importerer
string
, en modul som inneholder sekvenser av vanlige ASCII-tegn, ograndom
, en modul som håndterer tilfeldig generering.string.ascii_uppercase + string.digits
sammenkjeder bare listen over tegn som representerer store ASCII-tegn og sifre:Deretter bruker vi en listeforståelse for å lage en liste med 'n' elementer:
I eksemplet ovenfor bruker vi
[
for å opprette listen, men vi bruker ikkeid_generator
-funksjonen, slik at Python ikke oppretter listen i minnet, men genererer elementene på farten, ett etter ett (mer om dette her).I stedet for å be om å opprette 'n' ganger strengen
elem
, vil vi be Python om å opprette 'n' ganger et tilfeldig tegn, plukket fra en sekvens av tegn:Derfor
random.choice(chars) for _ in range(size)
skaper virkelig en sekvens avsize
tegn. Tegn som plukkes tilfeldig frategn
:Deretter kobler vi dem bare sammen med en tom streng slik at sekvensen blir en streng:
En enklere, raskere, men litt mindre tilfeldig måte er å bruke
random.sample
i stedet for å velge hver bokstav for seg. Hvis n gjentakelser er tillatt, kan du utvide det tilfeldige grunnlaget med n ganger, f.eks.Merk: random.sample forhindrer gjenbruk av tegn, ved å multiplisere størrelsen på tegnsettet blir flere gjentakelser mulig, men de er fortsatt mindre sannsynlige enn de er i et rent tilfeldig valg. Hvis vi går for en streng med lengde 6, og vi velger 'X' som det første tegnet, i valgeksemplet, er oddsen for å få 'X' for det andre tegnet det samme som oddsen for å få 'X' som det første tegnet. I random.sample-implementeringen er oddsen for å få 'X' som ethvert påfølgende tegn bare 6/7 sjansen for å få det som det første tegnet
Jeg trodde ingen hadde svart på dette ennå lol! Men hei, her er mitt eget forsøk: