Więcej
Generowanie losowych ciągów znaków z dużymi literami i cyframi
Chcę wygenerować ciąg znaków o rozmiarze N.
Powinien on składać się z liczb i wielkich liter angielskich, takich jak:
- 6U1S75
- 4Z4UKK
- U911K4
Jak mogę to osiągnąć w pythoniczny sposób?
1239
3
Odpowiedź w jednej linii:
lub nawet krócej, zaczynając od Pythona 3.6, używając
random.choices()
:Bezpieczniejsza kryptograficznie wersja; zobacz https://stackoverflow.com/a/23728630/2213647:.
W szczegółach, z czystą funkcją do dalszego wykorzystania:
**Jak to działa?
Importujemy
string
, moduł zawierający sekwencje zwykłych znaków ASCII, orazrandom
, moduł zajmujący się generowaniem losowym.String.ascii_uppercase + string.digits` po prostu konkatenuje listę znaków reprezentujących wielkie litery ASCII oraz cyfry:
Następnie używamy list comprehension, aby utworzyć listę 'n' elementów:
W powyższym przykładzie używamy
[
do utworzenia listy, ale nie w funkcjiid_generator
, więc Python nie tworzy listy w pamięci, ale generuje elementy w locie, jeden po drugim (więcej na ten temat tutaj).Zamiast prosić o utworzenie 'n' razy łańcucha
elem
, poprosimy Pythona o utworzenie 'n' razy losowego znaku, wybranego z ciągu znaków:Dlatego
random.choice(chars) for _ in range(size)
naprawdę tworzy ciąg znakówsize
. Znaków, które są losowo wybierane zchars
:Następnie po prostu łączymy je z pustym ciągiem, więc sekwencja staje się ciągiem:
Prostszym, szybszym, ale nieco mniej losowym sposobem jest użycie
random.sample
zamiast wybierania każdej litery osobno, Jeśli n-powtórzeń jest dozwolonych, powiększ swoją losową bazę o n razy np.Uwaga: random.sample zapobiega ponownemu użyciu znaków, zwielokrotnienie rozmiaru zestawu znaków sprawia, że wielokrotne powtórzenia są możliwe, ale nadal są mniej prawdopodobne niż w przypadku czystego losowego wyboru. Jeśli wybierzemy ciąg o długości 6, i wybierzemy 'X' jako pierwszy znak, w przykładzie wyboru, prawdopodobieństwo otrzymania 'X' jako drugiego znaku jest takie samo jak prawdopodobieństwo otrzymania 'X' jako pierwszego znaku. W implementacji random.sample szanse na otrzymanie 'X' jako dowolnego kolejnego znaku są tylko 6/7 szans na otrzymanie go jako pierwszego znaku.
Myślałem, że nikt nie odpowiedział na to jeszcze lol! Ale hej, tutaj'jest mój własny go na to: