Η δημιουργία τυχαίων αριθμών είναι σημαντική για πολλές εργασίες. Αυτά περιλαμβάνουν ανάπτυξη παιχνιδιών, κρυπτογραφία και ανάλυση δεδομένων. Οι τυχαίες τιμές επιτρέπουν διακριτά αποτελέσματα με ένα στοιχείο μεταβλητότητας και μη προβλεψιμότητας.
Το Go παρέχει δύο πακέτα για τη δημιουργία τυχαίων τιμών στην τυπική βιβλιοθήκη: μαθηματικά/Ραντ και crypto/rand. ο μαθηματικά/Ραντ Το πακέτο είναι κυρίως για μαθηματικές πράξεις. ο crypto/rand Το πακέτο χειρίζεται κρυπτογραφικά ασφαλείς λειτουργίες.
Τα πακέτα rand
ο μαθηματικά/Ραντ Το πακέτο παρέχει μια ευέλικτη μέθοδο για δημιουργώντας τυχαίους αριθμούς. Εφαρμόζει μια ποικιλία γενεών ψευδοτυχαίων αριθμών. Το πακέτο μπορεί να δημιουργήσει έναν τυχαίο αριθμό με διαφορετικές κατανομές και να χρησιμοποιήσει σπόρους για τον έλεγχο της τυχαίας ακολουθίας. Μπορεί επίσης να δημιουργήσει τυχαίους αριθμούς ταυτόχρονα ή παράλληλα.
ο crypto/rand Το πακέτο υλοποιεί μια κρυπτογραφικά ασφαλή γεννήτρια τυχαίων αριθμών. Περιλαμβάνει λειτουργικότητα για τη δημιουργία τυχαίων πρώτων αριθμών με μεγάλη πιθανότητα.
Δεδομένου ότι αυτά τα πακέτα έχουν το ίδιο όνομα, θα χρειαστεί να χρησιμοποιήσετε ψευδώνυμα εάν θέλετε να χρησιμοποιήσετε και τα δύο σε ένα μόνο πρόγραμμα, για παράδειγμα:
εισαγωγή (
κραντ "crypto/rand"
mrand "μαθηματικά/rand"
)
Δημιουργία τυχαίων ακεραίων στο Go
Μπορείτε να χρησιμοποιήσετε το μαθηματικά/ΡαντIntn συνάρτηση για τη δημιουργία τυχαίων αριθμών σε μια περιοχή.
εισαγωγή (
"fmt"
"μαθηματικά/rand"
"χρόνος"
)funcκύριος() {
άκρα. Σπόρος (χρόνος. Τώρα().UnixNano())// Το Intn δημιουργεί έναν τυχαίο ακέραιο μεταξύ 0 και 100
// (χωρίς 100)
randomInt := ραντ. Intn(100)
fmt. Println (randomInt)
}
Αυτός ο κωδικός περνά την τρέχουσα ώρα στο Σπόρος λειτουργία. Αρχικοποιεί την προεπιλεγμένη γεννήτρια τυχαίων αριθμών για ψευδοτυχαία.
ο Intn Η συνάρτηση του πακέτου rand δημιουργεί έναν τυχαίο αριθμό μεταξύ μιας καθορισμένης περιοχής, σε αυτήν την περίπτωση, από το 0 έως το 100.
Δημιουργήστε τυχαίους αριθμούς κινητής υποδιαστολής
Μπορείτε να δημιουργήσετε τυχαίους αριθμούς κινητής υποδιαστολής με το Float32 και Float64 λειτουργίες. Επιστρέφουν αριθμούς κινητής υποδιαστολής 32-bit και 64-bit αντίστοιχα.
Δείτε πώς μπορείτε να δημιουργήσετε τυχαίους αριθμούς κινητής υποδιαστολής 64 bit στο Go.
εισαγωγή (
"fmt"
"μαθηματικά/rand"
"χρόνος"
)funcκύριος() {
άκρα. Σπόρος (χρόνος. Τώρα().UnixNano())// δημιουργεί ένα τυχαίο float64 μεταξύ 0,0 και 1,0
randomFloat := ραντ. Float64()
fmt. Println (randomFloat)
}
Η διαδικασία δημιουργίας αριθμών κινητής υποδιαστολής 32 bit είναι η ίδια με τη δημιουργία τυχαίων αριθμών κινητής υποδιαστολής 64 bit.
Δημιουργία κρυπτογραφικά ασφαλών τυχαίων αριθμών στο Go
Μπορείτε να χρησιμοποιήσετε το Int λειτουργία του crypto/rand πακέτο για τη δημιουργία ενός κρυπτογραφικά ασφαλούς τυχαίου αριθμού. ο Int η συνάρτηση λαμβάνει σε μια περίπτωση ανάγνωσης και έναν μέγιστο αριθμό για το όριο.
εισαγωγή (
"crypto/rand"
"fmt"
"μαθηματικά/μεγάλα"
)funcκύριος() {
// Δημιουργία μεγάλου. Int με τη μέγιστη τιμή για το επιθυμητό εύρος
μέγ. := μεγάλο. NewInt(100000000)
// Δημιουργήστε ένα τυχαίο μεγάλο. Int
// Το πρώτο όρισμα είναι ένας αναγνώστης που επιστρέφει τυχαίους αριθμούς
// Το δεύτερο όρισμα είναι η μέγιστη τιμή (δεν συμπεριλαμβάνεται)
randInt, err := rand. Int (rand. Αναγνώστης, μέγ.)
αν λάθος!= μηδέν {
fmt. Println("Σφάλμα κατά τη δημιουργία τυχαίου αριθμού:", λάθος)
ΕΠΙΣΤΡΟΦΗ
}
fmt. Println("Τυχαίος αριθμός:", randInt)
}
ο Μέγιστη Η μεταβλητή ορίζει τη μέγιστη τιμή για τον τυχαίο αριθμό χρησιμοποιώντας το NewInt λειτουργία του μαθηματικά/μεγάλο πακέτο. ο Int Η συνάρτηση επιστρέφει τον τυχαίο ακέραιο και ένα σφάλμα για το χειρισμό.
Δημιουργία κρυπτογραφικά ασφαλών τυχαίων τιμών
ο crypto/rand Το πακέτο δεν παρέχει ενσωματωμένη λειτουργικότητα για δημιουργία κρυπτογραφικά ασφαλής τυχαίες χορδές. Ωστόσο, μπορείτε να το αντιμετωπίσετε χρησιμοποιώντας το Ανάγνωση λειτουργία.
εισαγωγή (
"crypto/rand"
"fmt"
)funcκρυπτοΤυχαίο(stringChars σειρά, αξίαΜήκος int32)σειρά {
bytesSlice := φτιαχνω, κανω([]ψηφιόλεξη, τιμήΜήκος)
_, λάθος := ραντ. Ανάγνωση (bytesSlice)αν λάθος!= μηδέν {
ΕΠΙΣΤΡΟΦΗ"Παρουσιάστηκε σφάλμα κατά την ανάγνωση από το κομμάτι byte"
}Για pos, τιμή := εύρος bytesSlice {
τυχαιοποίηση := τιμή % ψηφιόλεξη(λεν(StringChars))
bytesSlice[pos] = stringChars[τυχαιοποίηση]
}ΕΠΙΣΤΡΟΦΗσειρά(bytesSlice)
}
funcκύριος() {
fmt. Println (cryptoRandom("Πνευμονολυτρείο" +
"μικροσκοπική πυριτοηφαιστειοκονίαση", 10))
}
ο κρυπτοΤυχαίο Η παραπάνω συνάρτηση παίρνει μια συμβολοσειρά για να δημιουργήσει μια τυχαία συμβολοσειρά από. Παίρνει επίσης ένα μήκος—έναν ακέραιο 32-bit—και επιστρέφει μια συμβολοσειρά.
Στο κρυπτοΤυχαίο λειτουργία, η bytesSlice μεταβλητή είναι ένα κομμάτι του απαιτούμενου μήκους συμβολοσειράς. Ο βρόχος for-range διασχίζει το κομμάτι byte και επιστρέφει και ανακτά το μέτρο των στοιχείων του slice και το μήκος της συμβολοσειράς σε byte. Ενημερώνει το ευρετήριο του κομματιού byte με τον δείκτη τιμής modulo της συμβολοσειράς.
Τέλος, το κρυπτοΤυχαίο Η συνάρτηση επιστρέφει τη μορφή συμβολοσειράς του κομματιού byte.
Μπορείτε να δημιουργήσετε UUID με το Go
Η δημιουργία τυχαίων τιμών είναι χρήσιμη για ένα ευρύ φάσμα περιπτώσεων χρήσης. Εάν χρειάζεστε πολλές τυχαίες, μοναδικές τιμές, μπορείτε να χρησιμοποιήσετε UUID.
Τα UUID (Universally Unique Identifiers) εξασφαλίζουν παγκόσμια μοναδικότητα για τα αναγνωριστικά. Μπορείτε να τα χρησιμοποιήσετε για να διακρίνετε τους πόρους σε όλα τα συστήματα, αποφεύγοντας ταυτόχρονα τις συγκρούσεις ονομάτων.
Υπάρχουν πολλά πακέτα που μπορείτε να χρησιμοποιήσετε για να δημιουργήσετε UUID στο Go. Μπορείτε να χρησιμοποιήσετε το πακέτο os για να καλέσετε το uuid εντολή στο λειτουργικό σας σύστημα, καταφύγετε στο πακέτο UUID της Google ή χρησιμοποιήστε το πακέτο gouuid για να δημιουργήσετε UUID.