Рубрики
Без рубрики

Java – Генерирует случайные целые числа в диапазоне

– Java – Генерирует случайные целые числа в диапазоне

Автор оригинала: mkyong.

В этой статье мы покажем вам три способа генерации случайных целых чисел в диапазоне.

  1. java.util. java.util.
  2. java.util.
  3. java.util.Random.int (Java 8)

1. java.util. Случайный

Это Random().nextInt(int с привязкой) генерирует случайное целое число от 0 (включительно) до связанного (исключающего).

1.1 Фрагмент кода. Для 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 Что такое (макс – мин) + 1) + мин?

Приведенная выше формула будет генерировать случайное целое число в диапазоне от 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 Полные примеры для генерации 10 случайных целых чисел в диапазоне от 5 (включительно) до 10 (включительно).

package com.mkyong.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() дает случайное удвоение от 0,0 (включительно) до 1,0 (исключительное).

2.1 Фрагмент кода. Обратитесь к 1.2, более или менее это та же формула.

	(int)(Math.random() * ((max - min) + 1)) + min

2.2 Полные примеры для генерации 10 случайных целых чисел в диапазоне от 16 (включительно) до 20 (включительно).

package com.mkyong.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

3. Java 8 Случайных.ints

В Java 8 новые методы добавлены в java.util. Случайный

	public IntStream ints(int randomNumberOrigin, int randomNumberBound)
	public IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound) 

Это Random.ints(int происхождение, int привязка) или Random.ints(int min, int max) генерирует случайное целое число от исходного (включительно) до связанного (исключительного).

3.1 Фрагмент кода.

	private static int getRandomNumberInRange(int min, int max) {
	
		Random r = new Random();
		return r.ints(min, (max + 1)).findFirst().getAsInt();

	}

3.2 Полные примеры для генерации 10 случайных целых чисел в диапазоне от 33 (включительно) до 38 (включительно).

package com.mkyong.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 Дополнительно, для справки.

Генерирует случайные целые числа в диапазоне от 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

Рекомендации

  1. java.util. Случайный JavaDoc
  2. java.lang. Математический JavaDoc
  3. Форум Oracle: Генерация случайных чисел
  4. Генерация взвешенных случайных чисел в JavaScript

Оригинал: “https://mkyong.com/java/java-generate-random-integers-in-a-range/”