Random
Мы рассмотрим несколько подходов, включая базовую Java и сторонние решения:
Random.ints ()
Random.nextInt ()
Math.random ()
SecureRandom.nextInt ()
ThreadLocalRandom.nextInt ()
SplittableRandom.ints ()
Random.ints ()
Мы начали с Random.ints() который был добавлен в Random в Java 8 именно для этой цели. Изначально в Java не было полностью интуитивно понятного, встроенного решения этой задачи.
public static void main(String[] args) {List<Integer> integerList= new Random().ints(10, 1, 1000).boxed().toList();System.out.println(integerList);}//[686, 252, 493, 789, 629, 834, 842, 277, 717, 279]
new Random().ints(10, 1, 1000) - 1 число - количество чисел. 2 и 3 - диапазон от и до...
Random.nextInt()
Более классический пример, который вы часто будете видеть - это просто использование Random.nextInt(). Он принимает bound, который устанавливает верхнюю границу, а по умолчанию устанавливает нижнюю границу равной 0int min = 10;int max = 100;System.out.println(new Random().nextInt(max - min) + min);// 79
List
public static List<Integer> intsInRange(int size, int lowerBound, int upperBound) {Random random = new Random();List<Integer> result = new ArrayList<>();for (int i = 0; i < size; i++) {result.add(random.nextInt(upperBound - lowerBound) + lowerBound);}return result;}
List<Integer> integerList = intsInRange(5, 0, 1000);System.out.println(integerList);
Это ограниченное List воссоздание функции Random.ints() , которая просто возвращает список случайно сгенерированных целых чисел в диапазоне с заданным размером.
SecureRandom.nextInt ()
Класс SecureRandom является альтернативой классическому Random, но предоставляет криптографически стойкий генератор случайных чисел. Random изнутри полагается на системные часы для генерации начальных чисел, что не является на самом деле случайным.
С другой стороны, SecureRandom берет гораздо больше случайных данных из среды, чтобы сгенерировать гораздо более случайное начальное число.
Если вас беспокоит криптографическая безопасность, вы можете SecureRandom который ведет себя почти так же, как Random с точки зрения разработчика:
public static void main(String[] args) {int max = 100;int min = 10;int randomInt = new SecureRandom().nextInt(max - min) + min;System.out.println(randomInt);}// 95
А если вы хотите сгенерировать последовательности, можно создать вспомогательный метод:
public static List<Integer> intsInRange(int size, int lowerBound, int upperBound) {SecureRandom random = new SecureRandom();List<Integer> result = new ArrayList<>();for (int i = 0; i < size; i++) {result.add(random.nextInt(upperBound - lowerBound) + lowerBound);}return result;}
public static void main(String[] args) {List<Integer> integerList = intsInRange(5, 0, 1000);System.out.println(integerList);}// [206, 397, 682, 98, 505]
Math.random ()
Класс Math предоставляет нам отличные вспомогательные методы, связанные с математикой. Одним из них является Math.random() метод, который возвращает случайное значение между 0..1 . Обычно он используется для генерации случайных значений процентилей.
Однако, аналогично Random.nextInt() - вы можете использовать эту функциональность для генерации любого целого числа в определенном диапазоне:
public static void main(String[] args) {int min = 10;int max = 100;int randomNumber = (int)(Math.random() * (max + 1 - min) + min);System.out.println(randomNumber);}// 43
List
public static void main(String[] args) {List<Integer> integerList = intsInRange(5, 0, 1000);System.out.println(integerList);}// [350, 489, 461, 811, 735]public static List<Integer> intsInRange(int size, int lowerBound, int upperBound) {List<Integer> result = new ArrayList<>();for (int i = 0; i < size; i++) {result.add((int)(Math.random() * (upperBound + 1 - lowerBound) + lowerBound));}return result;}
ThreadLocalRandom.nextInt ()
Если вы работаете в многопоточной среде, ThreadLocalRandom предназначен для использования в качестве поточно-безопасного эквивалента Random. К счастью, он предлагает nextInt() метод как с верхней и нижней границы:
public static void main(String[] args) {int randomInt = ThreadLocalRandom.current().nextInt(0, 1000);System.out.println(randomInt);}// 957
public static void main(String[] args) {List<Integer> integerList = intsInRange(5, 0, 1000);System.out.println(integerList);}// [666, 542, 569, 823, 180]public static List<Integer> intsInRange(int size, int lowerBound, int upperBound) {List<Integer> result = new ArrayList<>();for (int i = 0; i < size; i++) {result.add(ThreadLocalRandom.current().nextInt(lowerBound, upperBound));}return result;}
SplittableRandom.ints ()
Менее известным классом в Java API является SplittableRandom который используется в качестве генератора псевдослучайных значений. Как следует из названия, он разделяется и работает параллельно, и на самом деле используется только тогда, когда у вас есть задачи, которые можно снова разделить на более мелкие подзадачи.
Стоит отметить, что этот класс также основан на незащищенной генерации семян - если вы ищете безопасную генерацию семян, используйте SecureRandom.
Класс предлагает ints(), который, с нашей точки зрения, работает также, как Random.ints():
public static void main(String[] args) {List<Integer> intList = new SplittableRandom().ints(5, 1, 1000).boxed().collect(Collectors.toList());System.out.println(intList);}// [324, 471, 425, 758, 532]