Περισσότερα
Δημιουργία τυχαίας συμβολοσειράς με κεφαλαία γράμματα και ψηφία
Θέλω να δημιουργήσω μια συμβολοσειρά μεγέθους N.
Θα πρέπει να αποτελείται από αριθμούς και κεφαλαία αγγλικά γράμματα όπως:
- 6U1S75
- 4Z4UKK
- U911K4
Πώς μπορώ να το επιτύχω αυτό με πυθωνικό τρόπο;
1239
3
Απάντηση σε μία γραμμή:
ή ακόμα συντομότερα ξεκινώντας από την Python 3.6 χρησιμοποιώντας `
random.choices()
:Μια κρυπτογραφικά ασφαλέστερη έκδοση- δείτε https://stackoverflow.com/a/23728630/2213647:
Σε λεπτομέρειες, με μια καθαρή συνάρτηση για περαιτέρω επαναχρησιμοποίηση:
Πώς δουλεύει;
Εισάγουμε το
string
, μια ενότητα που περιέχει ακολουθίες κοινών χαρακτήρων ASCII, και τοrandom
, μια ενότητα που ασχολείται με την τυχαία παραγωγή.Το
string.ascii_uppercase + string.digits
απλώς συνδέει τη λίστα χαρακτήρων που αντιπροσωπεύουν κεφαλαία ASCII και ψηφία:Στη συνέχεια χρησιμοποιούμε μια κατανόηση λίστας για να δημιουργήσουμε μια λίστα με 'n' στοιχεία:
Στο παραπάνω παράδειγμα, χρησιμοποιούμε το
[
για να δημιουργήσουμε τη λίστα, αλλά δεν το κάνουμε στη συνάρτησηid_generator
, έτσι ώστε η Python να μην δημιουργεί τη λίστα στη μνήμη, αλλά να δημιουργεί τα στοιχεία εν κινήσει, ένα προς ένα (περισσότερα γι' αυτό εδώ).Αντί να ζητάμε να δημιουργήσει 'n' φορές το αλφαριθμητικό
elem
, θα ζητήσουμε από την Python να δημιουργήσει 'n' φορές έναν τυχαίο χαρακτήρα, επιλεγμένο από μια ακολουθία χαρακτήρων:Επομένως, η
random.choice(chars) for _ in range(size)
στην πραγματικότητα δημιουργεί μια ακολουθία χαρακτήρων τουμεγέθους
. Χαρακτήρες που επιλέγονται τυχαία από τοchars
:Στη συνέχεια, απλά τους ενώνουμε με ένα κενό αλφαριθμητικό ώστε η ακολουθία να γίνει ένα αλφαριθμητικό:
Ένας απλούστερος, ταχύτερος αλλά ελαφρώς λιγότερο τυχαίος τρόπος είναι να χρησιμοποιήσετε το
random.sample
αντί να επιλέγετε κάθε γράμμα ξεχωριστά, Αν επιτρέπονται n-επαναλήψεις, διευρύνετε την τυχαία βάση σας κατά n φορές, π.χ.Σημείωση: Το random.sample αποτρέπει την επαναχρησιμοποίηση χαρακτήρων, ο πολλαπλασιασμός του μεγέθους της βάσης χαρακτήρων καθιστά δυνατές τις πολλαπλές επαναλήψεις, αλλά εξακολουθούν να είναι λιγότερο πιθανές από ό,τι σε μια καθαρά τυχαία επιλογή. Αν πάμε για μια συμβολοσειρά μήκους 6 και επιλέξουμε το 'X' ως πρώτο χαρακτήρα, στο παράδειγμα επιλογής, οι πιθανότητες να πάρουμε το 'X' για τον δεύτερο χαρακτήρα είναι ίδιες με τις πιθανότητες να πάρουμε το 'X' ως πρώτο χαρακτήρα. Στην εφαρμογή random.sample, οι πιθανότητες να λάβουμε το 'X' ως οποιονδήποτε επόμενο χαρακτήρα είναι μόνο 6/7 της πιθανότητας να το λάβουμε ως πρώτο χαρακτήρα.
Νόμιζα ότι κανένας δεν είχε απαντήσει σε αυτό ακόμα lol! Αλλά εδώ είναι η δική μου προσπάθεια: