Zufallsgenerierung von Zeichenketten mit Großbuchstaben und Ziffern
Ich möchte eine Zeichenkette der Größe N erzeugen.
Sie soll aus Zahlen und englischen Großbuchstaben bestehen, wie z. B.:
- 6U1S75
- 4Z4UKK
- U911K4
Wie kann ich dies auf eine pythonische Weise erreichen?
1239
3
Antwort in einer Zeile:
oder noch kürzer ab Python 3.6 mit
random.choices()
:Eine kryptographisch sicherere Version; siehe https://stackoverflow.com/a/23728630/2213647:
Im Detail, mit einer sauberen Funktion zur Weiterverwendung:
Wie funktioniert es?
Wir importieren
string
, ein Modul, das Sequenzen gängiger ASCII-Zeichen enthält, undrandom
, ein Modul, das sich mit der Zufallsgenerierung beschäftigt.string.ascii_uppercase + string.digits` verkettet einfach die Liste der Zeichen, die ASCII-Zeichen in Großbuchstaben und Ziffern darstellen:
Dann verwenden wir ein Listenverständnis, um eine Liste mit 'n' Elementen zu erstellen:
Im obigen Beispiel verwenden wir
[
, um die Liste zu erstellen, aber nicht in der Funktionid_generator
, so dass Python die Liste nicht im Speicher erstellt, sondern die Elemente nach und nach generiert (mehr dazu hier).Anstatt 'n' mal die Zeichenkette
elem
zu erzeugen, werden wir Python bitten, 'n' mal ein zufälliges Zeichen zu erzeugen, das aus einer Folge von Zeichen ausgewählt wird:Daher erzeugt
random.choice(chars) for _ in range(size)
wirklich eine Folge vonsize
Zeichen. Zeichen, die zufällig ausZeichen
ausgewählt werden:Dann fügen wir sie einfach mit einer leeren Zeichenkette zusammen, damit die Folge zu einer Zeichenkette wird:
Eine einfachere, schnellere, aber etwas weniger zufällige Methode ist die Verwendung von
random.sample
, anstatt jeden Buchstaben einzeln auszuwählen. Wenn n-Wiederholungen erlaubt sind, vergrößern Sie Ihre Zufallsbasis um n-mal, z.B.Anmerkung: random.sample verhindert die Wiederverwendung von Zeichen, die Vervielfachung der Größe des Zeichensatzes macht mehrfache Wiederholungen möglich, aber sie sind immer noch weniger wahrscheinlich als bei einer reinen Zufallsauswahl. Wenn wir uns für eine Zeichenkette der Länge 6 entscheiden und "X" als erstes Zeichen wählen, ist die Wahrscheinlichkeit, "X" als zweites Zeichen zu erhalten, genauso groß wie die Wahrscheinlichkeit, "X" als erstes Zeichen zu erhalten. In der random.sample-Implementierung ist die Wahrscheinlichkeit, "X" als ein beliebiges nachfolgendes Zeichen zu erhalten, nur 6/7 der Wahrscheinlichkeit, es als erstes Zeichen zu erhalten
Ich dachte, darauf hätte noch niemand geantwortet, lol! Aber hey, hier ist mein eigener Versuch dazu: