Java - генерировать случайные целые числа в диапазоне
В этой статье мы покажем вам три способа генерации случайных целых чисел в диапазоне.
-
java.util.Random.nextInt
-
Math.random
-
java.util.Random.ints (Java 8)
1. java.util.Random
ЭтотRandom().nextInt(int bound)
генерирует случайное целое число от 0 (включительно) до связанного (исключительного).
1.1 Code snippet. ДляgetRandomNumberInRange(5, 10)
это сгенерирует случайное целое число от 5 (включительно) до 10 (включительно).
private static int getRandomNumberInRange(int min, int max) { if (min >= max) { throw new IllegalArgumentException("max must be greater than min"); } Random r = new Random(); return r.nextInt((max - min) + 1) + min; }
1.2 What is (max – min) + 1) + min?
Вышеупомянутая формула будет генерировать случайное целое число в диапазоне от min (включительно) до max (включительно).
//Random().nextInt(int bound) = Random integer from 0 (inclusive) to bound (exclusive) //1. nextInt(range) = nextInt(max - min) new Random().nextInt(5); // [0...4] [min = 0, max = 4] new Random().nextInt(6); // [0...5] new Random().nextInt(7); // [0...6] new Random().nextInt(8); // [0...7] new Random().nextInt(9); // [0...8] new Random().nextInt(10); // [0...9] new Random().nextInt(11); // [0...10] //2. To include the last value (max value) = (range + 1) new Random().nextInt(5 + 1) // [0...5] [min = 0, max = 5] new Random().nextInt(6 + 1) // [0...6] new Random().nextInt(7 + 1) // [0...7] new Random().nextInt(8 + 1) // [0...8] new Random().nextInt(9 + 1) // [0...9] new Random().nextInt(10 + 1) // [0...10] new Random().nextInt(11 + 1) // [0...11] //3. To define a start value (min value) in a range, // For example, the range should start from 10 = (range + 1) + min new Random().nextInt(5 + 1) + 10 // [0...5] + 10 = [10...15] new Random().nextInt(6 + 1) + 10 // [0...6] + 10 = [10...16] new Random().nextInt(7 + 1) + 10 // [0...7] + 10 = [10...17] new Random().nextInt(8 + 1) + 10 // [0...8] + 10 = [10...18] new Random().nextInt(9 + 1) + 10 // [0...9] + 10 = [10...19] new Random().nextInt(10 + 1) + 10 // [0...10] + 10 = [10...20] new Random().nextInt(11 + 1) + 10 // [0...11] + 10 = [10...21] // Range = (max - min) // So, the final formula is ((max - min) + 1) + min //4. Test [10...30] // min = 10 , max = 30, range = (max - min) new Random().nextInt((max - min) + 1) + min new Random().nextInt((30 - 10) + 1) + 10 new Random().nextInt((20) + 1) + 10 new Random().nextInt(21) + 10 //[0...20] + 10 = [10...30] //5. Test [15...99] // min = 15 , max = 99, range = (max - min) new Random().nextInt((max - min) + 1) + min new Random().nextInt((99 - 15) + 1) + 15 new Random().nextInt((84) + 1) + 15 new Random().nextInt(85) + 15 //[0...84] + 15 = [15...99] //Done, understand?
1.3 Full examples to generate 10 random integers in a range between 5 (inclusive) and 10 (inclusive).
TestRandom.java
package com.example.example.test; import java.util.Random; public class TestRandom { public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(getRandomNumberInRange(5, 10)); } } private static int getRandomNumberInRange(int min, int max) { if (min >= max) { throw new IllegalArgumentException("max must be greater than min"); } Random r = new Random(); return r.nextInt((max - min) + 1) + min; } }
Выход.
7 6 10 8 9 5 7 10 8 5
2. Math.random
ЭтотMath.random()
дает случайное двойное значение от 0,0 (включительно) до 1,0 (исключая).
2.1 Code snippet. Обратитесь к 1.2, более-менее это та же формула.
(int)(Math.random() * ((max - min) + 1)) + min
2.2 Full examples to generate 10 random integers in a range between 16 (inclusive) and 20 (inclusive).
TestRandom.java
package com.example.example.test; public class TestRandom { public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(getRandomNumberInRange(16, 20)); } } private static int getRandomNumberInRange(int min, int max) { if (min >= max) { throw new IllegalArgumentException("max must be greater than min"); } return (int)(Math.random() * ((max - min) + 1)) + min; } }
Выход.
17 16 20 19 20 20 20 17 20 16
NoteRandom.nextInt(n)
более эффективен, чемMath.random() * n
, прочтите этоOracle
forum post.
3. Java 8 Random.ints
В Java 8 новые методы добавляются вjava.util.Random
public IntStream ints(int randomNumberOrigin, int randomNumberBound) public IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound)
ЭтотRandom.ints(int origin, int bound)
илиRandom.ints(int min, int max)
генерирует случайное целое число от источника (включительно) до связанного (исключительного).
3.1 Code snippet.
private static int getRandomNumberInRange(int min, int max) { Random r = new Random(); return r.ints(min, (max + 1)).findFirst().getAsInt(); }
3.2 Full examples to generate 10 random integers in a range between 33 (inclusive) and 38 (inclusive).
TestRandom.java
package com.example.form.test; import java.util.Random; public class TestRandom { public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(getRandomNumberInRange(33, 38)); } } private static int getRandomNumberInRange(int min, int max) { Random r = new Random(); return r.ints(min, (max + 1)).limit(1).findFirst().getAsInt(); } }
Выход.
34 35 37 33 38 37 34 35 36 37
3.3 Extra, for self-reference.
Создает случайные целые числа в диапазоне от 33 (включительно) до 38 (исключая) с размером потока 10. И распечатайте элементы сforEach
.
//Java 8 only new Random().ints(10, 33, 38).forEach(System.out::println);
Выход.
34 37 37 34 34 35 36 33 37 34