How do I generate random integers within a specific range in Java?
Как мне сгенерировать случайные целые числа в определенном диапазоне в Java?
Как мне сгенерировать случайное int значение в определенном диапазоне?
В следующих методах есть ошибки, связанные с целочисленным переполнением:
randomNum = minimum + (int)(Math.random() * maximum); // Bug: `randomNum` can be bigger than `maximum`.
Randomrn=newRandom(); intn= maximum - minimum + 1; inti= rn.nextInt() % n; randomNum = minimum + i; // Bug: `randomNum` can be smaller than `minimum`.
Переведено автоматически
Ответ 1
В Java 1.7 или более поздней версии стандартный способ сделать это следующий:
import java.util.concurrent.ThreadLocalRandom;
// nextInt is normally exclusive of the top value, // so add 1 to make it inclusive intrandomNum= ThreadLocalRandom.current().nextInt(min, max + 1);
Смотрите соответствующий JavaDoc . Преимущество этого подхода в том, что нет необходимости явно инициализировать java.util .Случайный экземпляр, который может быть источником путаницы и ошибок при ненадлежащем использовании.
Однако, наоборот, нет способа явно задать начальное значение, поэтому может быть трудно воспроизвести результаты в ситуациях, когда это полезно, таких как тестирование или сохранение состояний игры или подобных. В таких ситуациях можно использовать технику, разработанную до 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) */ publicstaticintrandInt(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 intrandomNum= rand.nextInt((max - min) + 1) + min;
В частности, нет необходимости изобретать колесо генерации случайных целых чисел, когда в стандартной библиотеке есть простой API для выполнения задачи.
Одним из стандартных шаблонов для достижения этой цели является:
Min + (int)(Math.random() * ((Max - Min) + 1))
Функция математической библиотеки Java Math.random() генерирует двойное значение в диапазоне [0,1). Обратите внимание, что в этот диапазон не входит 1.
Чтобы сначала получить определенный диапазон значений, вам нужно умножить на величину диапазона значений, который вы хотите охватить.
Math.random() * ( Max - Min )
Это возвращает значение в диапазоне [0,Max-Min), где 'Max-Min' не включено.
Например, если вы хотите [5,10), вам нужно покрыть пять целых значений, поэтому вы используете
Math.random() * 5
Это вернет значение в диапазоне [0,5), где 5 не включено.
Теперь вам нужно сместить этот диапазон до диапазона, на который вы ориентируетесь. Вы делаете это, добавляя минимальное значение.
Min + (Math.random() * (Max - Min))
Теперь вы получите значение в диапазоне [Min,Max). Следуя нашему примеру, это означает [5,10):
5 + (Math.random() * (10 - 5))
Но это все еще не включает Max и вы получаете двойное значение. Чтобы получить включенное Max значение, вам нужно добавить 1 к вашему параметру range (Max - Min), а затем усечь десятичную часть путем преобразования в int . Это достигается с помощью:
Min + (int)(Math.random() * ((Max - Min) + 1))
И вот оно. Случайное целое значение в диапазоне [Min,Max] или в соответствии с примером [5,10]:
5 + (int)(Math.random() * ((10 - 5) + 1))
Ответ 3
Использование:
Randomran=newRandom(); intx= ran.nextInt(6) + 5;
Целое число x теперь является случайным числом, которое имеет возможный результат 5-10.