Генератор случайных чисел на Java

Сегодня мы рассмотрим, как сгенерировать случайное число на Java. Иногда нам нужно генерировать случайные числа в программах на Java. Например, в игре в кости или для создания случайного идентификатора ключа для шифрования и т. д.

Генератор случайных чисел на Java

Существует много способов генерации случайного числа на Java.

  1. Класс java.util.Random может быть использован для создания случайных чисел. Он предоставляет несколько методов для генерации случайных целых, длинных, вещественных чисел и т. д.
  2. Также можно использовать Math.random() для генерации вещественного числа. Этот метод внутренне использует класс Java Random.
  3. Класс java.util.concurrent.ThreadLocalRandom следует использовать для генерации случайного числа в многопоточной среде. Этот класс является частью пакета Java Concurrent и был введен в Java 1.7. В этом классе есть методы, аналогичные классу Java Random.
  4. Класс java.security.SecureRandom можно использовать для генерации случайного числа с высокой степенью безопасности. Этот класс предоставляет криптографически надежный генератор случайных чисел. Однако он медленный в обработке. Поэтому, в зависимости от требований вашего приложения, вы должны решить, использовать его или нет.

Генератор случайных чисел Java

Давайте рассмотрим несколько примеров генерации случайного числа в Java. Позже мы также рассмотрим пример программы с использованием ThreadLocalRandom и SecureRandom.

1. Генерация случайного целого числа

Random random = new Random();

int rand = random.nextInt();

Да, это настолько просто генерировать случайное целое число в Java. Когда мы создаем экземпляр Random, он генерирует длинное начальное значение, которое используется во всех вызовах методов nextXXX. Мы можем установить это начальное значение в программе, однако это не требуется в большинстве случаев.

// установить длинное начальное значение, используя конструктор Random
Random random = new Random(123456789);

// установить длинное начальное значение с использованием метода установки
Random random1 = new Random();
random1.setSeed(1234567890);

2. Случайное число в Java между 1 и 10

Иногда нам нужно сгенерировать случайное число в пределах диапазона. Например, в игре в кости возможные значения могут быть только от 1 до 6. Ниже приведен код, показывающий, как сгенерировать случайное число между 1 и 10 включительно.

Random random = new Random();
int rand = 0;
while (true){
    rand = random.nextInt(11);
    if(rand !=0) break;
}
System.out.println(rand);

Аргумент в nextInt(int x) исключается, поэтому мы должны предоставить аргумент как 11. Кроме того, 0 включено в сгенерированное случайное число, поэтому мы должны продолжать вызывать метод nextInt, пока не получим значение между 1 и 10. Вы можете расширить вышеуказанный код для генерации случайного числа в любом заданном диапазоне.

3. Сгенерировать случайное число с плавающей запятой

Мы можем использовать Math.random() или метод nextDouble класса Random для генерации случайного числа с плавающей запятой в Java.

Random random = new Random();

double d = random.nextDouble();

double d1 = Math.random();

4. Сгенерировать случайное число с плавающей точкой

Random random = new Random();

float f = random.nextFloat();

5. Сгенерировать случайное длинное число

Random random = new Random();

long l = random.nextLong();

6. Сгенерировать случайное логическое значение

Random random = new Random();

boolean flag = random.nextBoolean();

7. Сгенерировать массив случайных байт

Мы можем сгенерировать случайные байты и поместить их в предоставленный пользователем массив байтов, используя класс Random. Количество сгенерированных случайных байтов равно длине массива байтов.

Random random = new Random();

byte[] randomByteArray = new byte[5];

random.nextBytes(randomByteArray);

System.out.println(Arrays.toString(randomByteArray)); // sample output [-70, -57, 74, 99, -78]

8. ThreadLocalRandom в многопоточной среде

Вот простой пример использования ThreadLocalRandom в многопоточной среде.

package com.journaldev.randomnumber;

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

public class ThreadLocalRandomExample {

	public static void main(String[] args) {
		Runnable runnable = new MyRunnable();

		for (int i = 0; i < 5; i++) {
			Thread t = new Thread(runnable);
			t.setName("MyRunnable-Thread-" + i);
			t.start();
		}
	}

}

class MyRunnable implements Runnable {

	@Override
	public void run() {
		String threadName = Thread.currentThread().getName();
		System.out.println(threadName + "::" + ThreadLocalRandom.current().nextInt());
	}

}

Ниже приведен пример вывода выполнения вышеуказанной программы.

MyRunnable-Thread-0::-1744088963
MyRunnable-Thread-3::139405798
MyRunnable-Thread-1::1403710182
MyRunnable-Thread-2::-1222080205
MyRunnable-Thread-4::-185825276

Нельзя установить значение семени для экземпляра ThreadLocalRandom, это вызовет UnsupportedOperationException. Класс ThreadLocalRandom также имеет несколько дополнительных утилитарных методов для генерации случайного числа в пределах заданного диапазона. Например, чтобы сгенерировать случайное число от 1 до 10, мы можем сделать это следующим образом.

ThreadLocalRandom random = ThreadLocalRandom.current();
		
int rand = random.nextInt(1, 11);

У ThreadLocalRandom есть аналогичные методы для генерации случайных значений типа long и double.

9. Пример использования SecureRandom

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

Random random = new SecureRandom();

int rand = random.nextInt();

System.out.println(rand);

Это все о генерации случайного числа в программе на Java.

Вы можете скачать пример кода из нашего репозитория на GitHub.

Source:
https://www.digitalocean.com/community/tutorials/random-number-generator-java