Πώς να δημιουργήσετε τυχαίο αριθμό σε Java
⚡ Έξυπνη Σύνοψη
Τυχαίες αριθμοί σε Java προέρχονται από τέσσερις σχετικές τυπικές επιλογές βιβλιοθήκης, την κλάση Random, το Math.random, το ThreadLocalRandom και το SecureRandom, καθεμία από τις οποίες καλύπτει ένα διαφορετικό μείγμα ταχύτητας, ασφάλειας νημάτων και κρυπτογραφικής ισχύος για πραγματικές εφαρμογές.

Τυχαίες αριθμοί εμφανίζονται παντού Java, από δεδομένα δοκιμής μονάδων και παιχνίδια με ζάρια μέχρι μάρκες συνεδρίας και ανακατεμένες τράπουλες. Αυτό το σεμινάριο εξηγεί πώς να δημιουργήσετε τυχαίους αριθμούς στο Java χρησιμοποιώντας κάθε επιλογή στην τυπική βιβλιοθήκη και πώς να επιλέξετε την κατάλληλη για την εργασία.
Δημιουργία τυχαίου αριθμού σε Java
The Java Η τυπική βιβλιοθήκη προσφέρει τέσσερις συνηθισμένους τρόπους για να δημιουργήσετε έναν τυχαίο αριθμό:
java.util.Randomείναι η κλάση γενικής χρήσης. Παράγει τιμές boolean, int, long, float και double μέσω μεθόδων όπωςnextInt,nextLongκαιnextDouble.Math.randomείναι ένας στατικός βοηθός που επιστρέφει μια τιμή double μεταξύ 0.0 (συμπεριλαμβανομένου) και 1.0 (εξαιρουμένου) χρησιμοποιώντας ένα κοινόχρηστοRandomεσωτερικώς.ThreadLocalRandominjava.util.concurrentδίνει σε κάθε νήμα τη δική του γεννήτρια, επομένως πολλά νήματα δεν ανταγωνίζονται σε μία μόνο περίπτωση.SecureRandominjava.securityπαράγει κρυπτογραφικά ισχυρούς ψευδοτυχαίους αριθμούς για κωδικούς πρόσβασης, αναγνωριστικά συνεδρίας και κλειδιά.
Οι παρακάτω ενότητες δείχνουν πώς να δημιουργήσετε δέκα τυχαίους αριθμούς με κάθε προσέγγιση.
Παράδειγμα: Δημιουργία τυχαίου αριθμού χρησιμοποιώντας Java Τυχαία τάξη
Το πρώτο παράδειγμα χρησιμοποιεί java.util.Random για να παραγάγετε δέκα ακέραιους αριθμούς στην περιοχή από 0 έως και 99:
import java.util.Random; public class RandomNumbers { public static void main(String[] args) { Random objGenerator = new Random(); for (int iCount = 0; iCount < 10; iCount++) { int randomNumber = objGenerator.nextInt(100); System.out.println("Random No : " + randomNumber); } } }
Παραγωγή:
Random No : 17 Random No : 57 Random No : 73 Random No : 48 Random No : 68 Random No : 86 Random No : 34 Random No : 97 Random No : 73 Random No : 18
Ένα παράδειγμα Random δημιουργείται ως objGenerator. ο nextInt(int bound) Η μέθοδος επιστρέφει μια τιμή μεταξύ 0 (συμπεριλαμβανομένου) και του παρεχόμενου ορίου (αποκλεισμού), επομένως nextInt(100) αποδίδει τιμές από 0 έως 99. Για να κάνετε την ακολουθία αναπαραγώγιμη, περάστε μια αρχική τιμή στον κατασκευαστή, για παράδειγμα new Random(42); ο ίδιος σπόρος παράγει πάντα την ίδια ακολουθία, η οποία είναι χρήσιμη σε δοκιμές και προσομοιώσεις.
Παράδειγμα: Χρήση Java Μαθηματικά τυχαία
Για να δημιουργήσετε δέκα τυχαίες τιμές στην περιοχή 0.0 έως 1.0, καλέστε τη στατική συνάρτηση Math.random μέθοδος μέσα σε ένα βρόχοςΑυτός είναι ο γρηγορότερος τρόπος για να αποκτήσετε ένα τυχαίο διπλό χωρίς να δημιουργήσετε ένα αντικείμενο γεννήτριας:
public class DemoRandom { public static void main(String[] args) { for (int xCount = 0; xCount < 10; xCount++) { System.out.println(Math.random()); } } }
Παραγωγή:
0.46518450373334297 0.14859851177803485 0.5628391820492477 0.6323378498048606 0.1740198445692248 0.9140544122258946 0.9167350036262347 0.49251219841030147 0.7426056725722353 0.2039418871298877
Κάτω από το καπό, Math.random δημιουργεί ένα ενιαίο στατικό Random κατά την πρώτη χρήση και τις κλήσεις nextDouble σε αυτό. Αυτή η ενιαία κοινόχρηστη γεννήτρια είναι μια χαρά για demos, αλλά γίνεται σημείο συμφόρησης υπό βαρύ πολυνηματικό φορτίο, το οποίο εξετάζουν οι επόμενες ενότητες.
Δημιουργία τυχαίου αριθμού σε προσαρμοσμένο εύρος
Τα πραγματικά προγράμματα συνήθως χρειάζονται μια τυχαία τιμή εντός ενός συγκεκριμένου εύρους, όπως έναν ακέραιο αριθμό μεταξύ 1 και 6 για μια ρίψη ζαριού ή ένα διπλό αριθμό μεταξύ 10.0 και 20.0 για μια προσομοίωση. Δύο μοτίβα καλύπτουν σχεδόν κάθε περίπτωση.
Τυχαίος ακέραιος αριθμός μεταξύ min και max (συμπεριλαμβανομένου):
import java.util.Random; public class RangeDemo { public static void main(String[] args) { Random rnd = new Random(); int min = 1; int max = 6; // nextInt(max - min + 1) returns 0..(max-min), then shift by min int dice = rnd.nextInt(max - min + 1) + min; System.out.println("Dice roll : " + dice); } }
Τυχαίο διπλό μεταξύ ελάχιστου και μέγιστου:
double min = 10.0; double max = 20.0; double value = min + (max - min) * Math.random(); System.out.println("Value : " + value);
Και τα δύο μοτίβα λειτουργούν λαμβάνοντας μια τιμή από το εγγενές εύρος της γεννήτριας, κλιμακώνοντάς την στο πλάτος του εύρους-στόχου και μετατοπίζοντάς την προς τα πάνω κατά το ελάχιστο. Εάν είστε ενεργοποιημένοι Java 8 ή νεότερη έκδοση, το ίδιο αποτέλεσμα είναι διαθέσιμο μέσω της νεότερης ints, longsκαι doubles μέθοδοι ροής σε Random, Για παράδειγμα rnd.ints(10, 1, 7).forEach(System.out::println) για δέκα ζάρια.
ThreadLocalRandom για πολυνηματικό Code
Ένα κοινόχρηστο Random είναι ασφαλές για νήματα αλλά αργό υπό ανταγωνισμό επειδή κάθε νήμα πρέπει να συγχρονίζεται στον ίδιο εσωτερικό σπόρο. ThreadLocalRandom, προστέθηκε Java 7 και ζουν σε java.util.concurrent, δίνει σε κάθε νήμα τη δική του γεννήτρια, επομένως δεν υπάρχει διεκδίκηση κλειδώματος.
import java.util.concurrent.ThreadLocalRandom; public class ThreadLocalDemo { public static void main(String[] args) { // random int in [1, 100] int i = ThreadLocalRandom.current().nextInt(1, 101); // random long in [1000, 5000] long l = ThreadLocalRandom.current().nextLong(1000L, 5001L); // random double in [0.0, 1.0) double d = ThreadLocalRandom.current().nextDouble(); System.out.println(i + " " + l + " " + d); } }
Χρήση ThreadLocalRandom.current() μέσα σε νήματα εργασίας, παράλληλες ροές και οποιαδήποτε ταυτόχρονη εργασία. Σημειώστε ότι setSeed ρίχνει UnsupportedOperationException, επομένως η σπορά για αναπαραγωγιμότητα δεν υποστηρίζεται. Εάν χρειάζεστε σταθερό σπόρο, προτιμήστε τον απλό. Random.
SecureRandom για τυχαίες ευαίσθητες στην ασφάλεια Numbers
Περιπτώσεις του Random και ThreadLocalRandom δεν είναι κρυπτογραφικά ασφαλή. Δεδομένων μερικών δειγμάτων εξόδου, ένας εισβολέας μπορεί να ανακατασκευάσει την εσωτερική κατάσταση και να προβλέψει μελλοντικές τιμές. Για κωδικούς πρόσβασης, διακριτικά συνεδρίας, τιμές salt και κρυπτογραφικά κλειδιά, χρησιμοποιήστε java.security.SecureRandom Αντλεί υλικό εκκίνησης από την εντροπία του λειτουργικού συστήματος και παράγει τιμές που αντιστέκονται στην πρόβλεψη.
import java.security.SecureRandom; public class SecureDemo { public static void main(String[] args) { SecureRandom secure = new SecureRandom(); byte[] token = new byte[16]; secure.nextBytes(token); // 128-bit random token int otp = secure.nextInt(1_000_000); // 6-digit one-time code System.out.println("OTP : " + String.format("%06d", otp)); } }
SecureRandom είναι πιο αργό από Random επειδή χρησιμοποιεί ισχυρότερους αλγόριθμους και πλουσιότερο υλικό εκκίνησης. Κρατήστε το για εργασίες ασφαλείας και χρησιμοποιήστε τις ταχύτερες γεννήτριες για παιχνίδια, προσομοιώσεις και δεδομένα δοκιμών.
