Πώς μπορώ να δημιουργήσω μια τυχαία τιμή int
σε ένα συγκεκριμένο εύρος τιμών;
Δοκίμασα τα ακόλουθα, αλλά αυτά δεν λειτουργούν:
Προσπάθεια 1:
randomNum = minimum + (int)(Math.random() * maximum);
// Bug: `randomNum` can be bigger than `maximum`.
Απόπειρα 2:
Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum = minimum + i;
// Bug: `randomNum` can be smaller than `minimum`.
Στην Java 1.7 ή μεταγενέστερη έκδοση, ο τυπικός τρόπος για να γίνει αυτό είναι ο εξής:
import java.util.concurrent.ThreadLocalRandom;
// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
int randomNum = ThreadLocalRandom.current().nextInt(min, max + 1);
Βλέπε το σχετικό JavaDoc. Αυτή η προσέγγιση έχει το πλεονέκτημα ότι δεν χρειάζεται να αρχικοποιήσετε ρητά μια περίπτωση java.util.Random, η οποία μπορεί να αποτελέσει πηγή σύγχυσης και λάθους αν χρησιμοποιηθεί ακατάλληλα.
Ωστόσο, αντίθετα, δεν υπάρχει τρόπος να οριστεί ρητά ο σπόρος, οπότε μπορεί να είναι δύσκολη η αναπαραγωγή των αποτελεσμάτων σε καταστάσεις όπου αυτό είναι χρήσιμο, όπως η δοκιμή ή η αποθήκευση καταστάσεων παιχνιδιού ή κάτι παρόμοιο. Σε αυτές τις περιπτώσεις, μπορεί να χρησιμοποιηθεί η τεχνική προ της Java 1.7 που παρουσιάζεται παρακάτω.
Πριν από τη Java 1.7, ο συνήθης τρόπος για να γίνει αυτό είναι ο εξής:
import java.util.Random;
/**
* Returns a pseudo-random number between min and max, inclusive.
* The difference between min and max can be at most
* <code>Integer.MAX_VALUE - 1</code>.
*
* @param min Minimum value
* @param max Maximum value. Must be greater than min.
* @return Integer between min and max, inclusive.
* @see java.util.Random#nextInt(int)
*/
public static int randInt(int min, int max) {
// NOTE: This will (intentionally) not run as written so that folks
// copy-pasting have to think about how to initialize their
// Random instance. Initialization of the Random instance is outside
// the main scope of the question, but some decent options are to have
// a field that is initialized once and then re-used as needed or to
// use ThreadLocalRandom (if using at least Java 1.7).
//
// In particular, do NOT do 'Random rand = new Random()' here or you
// will get not very good / not very random results.
Random rand;
// nextInt is normally exclusive of the top value,
// so add 1 to make it inclusive
int randomNum = rand.nextInt((max - min) + 1) + min;
return randomNum;
}
Βλέπε το σχετικό JavaDoc. Στην πράξη, η κλάση java.util.Random είναι συχνά προτιμότερη από την java.lang.Math.random().
Ειδικότερα, δεν υπάρχει λόγος να ανακαλύψουμε εκ νέου τον τροχό της παραγωγής τυχαίων ακεραίων όταν υπάρχει ένα απλό API μέσα στην τυπική βιβλιοθήκη για την επίτευξη του στόχου.
Χρήση:
minimum + rn.nextInt(maxValue - minvalue + 1)
rand.nextInt((max+1) - min) + min;