Willekeurige tekenreeksen met hoofdletters en cijfers
Ik wil een string genereren van grootte N.
Het moet bestaan uit cijfers en Engelse hoofdletters, zoals:
- 6U1S75
- 4Z4UKK
- U911K4
Hoe kan ik dit op een pythonische manier bereiken?
1239
3
**Antwoord op één regel.
of zelfs korter vanaf Python 3.6 met behulp van
random.choices()
:Een cryptografisch veiliger versie; zie https://stackoverflow.com/a/23728630/2213647:
In detail, met een schone functie voor verder hergebruik:
Hoe werkt het ?
We importeren
string
, een module die sequenties van gewone ASCII karakters bevat, enrandom
, een module die zich bezighoudt met willekeurige generatie.string.ascii_uppercase + string.digits
voegt gewoon de lijst van tekens samen die hoofdletters en cijfers in ASCII voorstellen:Dan gebruiken we een list comprehension om een lijst van 'n' elementen te maken:
In het bovenstaande voorbeeld gebruiken we
[
om de lijst te maken, maar dat doen we niet in deid_generator
functie, zodat Python de lijst niet in het geheugen maakt, maar de elementen één voor één genereert (meer hierover hier).In plaats van te vragen om 'n' keer de string
elem
aan te maken, zullen we Python vragen om 'n' keer een willekeurig karakter aan te maken, gekozen uit een reeks karakters:Daarom is
random.choice(chars) for _ in range(size)
echt het creëren van een reekssize
karakters. Tekens die willekeurig worden gekozen uitchars
:Dan voegen we ze samen met een lege string, zodat de reeks een string wordt:
Een eenvoudigere, snellere maar iets minder willekeurige manier is om
random.sample
te gebruiken in plaats van elke letter apart te kiezen, Als n-herhalingen zijn toegestaan, vergroot dan je willekeurige basis met n keer, bijv.Opmerking: random.sample voorkomt hergebruik van karakters, het vermenigvuldigen van de grootte van de karakterset maakt meerdere herhalingen mogelijk, maar ze zijn nog steeds minder waarschijnlijk dan in een zuiver willekeurige keuze. Als we gaan voor een string van lengte 6, en we kiezen 'X' als het eerste teken, in het keuzevoorbeeld, is de kans om 'X' te krijgen voor het tweede teken hetzelfde als de kans om 'X' te krijgen als het eerste teken. In de random.sample implementatie is de kans om 'X' als een volgend teken te krijgen slechts 6/7 van de kans om het als het eerste teken te krijgen
Ik dacht dat niemand dit al beantwoord had. Maar hey, hier's mijn eigen poging: