Вводный курс. Язык программирования Java
- Вводный курс. Язык программирования Java
- Просмотров: 26730
8. Генерация случайных чисел в заданном диапазоне
Существует несколько способов генерации случайного (псевдослучайного) числа:
- Использование метода random() из класса математических функций Math, находящемся в пакете java.lang.
- Использование метода random() из класса Random, находящемся в пакете java.util.Random.
- Использование генератора случайных чисел класса SecureRandom, предназначенного для целей криптографии и, находящегося в пакете java.security.SecureRandom (здесь не рассматривается).
Рассмотрим методы генерации случайных чисел.
-
Класс Math. Метод random()
Метод random() класса Math возвращает псевдослучайное число типа double в диапазоне 0 ≤ Math.random() < 1.
Пример 1. Несколько случайных чисел
public static void main(String[] args) {
System.out.println("Cлучайное число № 1: " + Math.random());
System.out.println("Случайное число № 2: " + Math.random());
System.out.println("Случайное число № 3: " + Math.random());
}
Результат.
Случайное число № 1: 0.9161994380531232
Случайное число № 2: 0.24340742865928744
Случайное число № 3: 0.9783627451986034
Пример 2. Случайное число x в диапазоне a ≤ x ≤ b
Для генерации целого случайного числа x в заданном диапазоне a ≤ x ≤ b, обычно используется следующая зависимость:
x = a + (int)(Math.random()*((b - a) + 1)).
Получим случайное число x в диапазоне: 10 ≤ x ≤ 20 (a=10, b=20).
int a=10;
int b=20;
int x= a + (int)(Math.random() * ((b - a) + 1));
System.out.println("Случайное число x: " + x);
Результат.
Случайное число x: 19
-
Класс Random. Метод random()
Это наиболее часто используемый класс для генерации псевдослучайный чисел с равномерной функцией распределения. Имеется метод nextGaussian(), который моделирует функцию нормального распределения.
Основными методами этого класса являются:
- int nextInt() - возвращает следующее случайное значение ix типа int в диапазоне -2147483648 ≤ ix < 2147483647
- int nextInt(int n) - возвращает следующее случайное значение ix типа int в диапазоне 0 ≤ ix < n
- float nextFloat() - возвращает следующее случайное значение fx типа float в диапазоне 0.0 ≤ fx < 1.0
- double nextDouble() - возвращает следующее случайное значение dx типа double в диапазоне 0.0 ≤ dx < 1.0
- boolean nextBoolean() - возвращает следующее случайное значение типа boolean
Для получения случайных чисел необходимо:
- Подключить библиотеку случайных чисел. Пишем до определения класса.
import java.util.Random; - В классе создать объект rand случайных чисел
Random rand = new Random(); - Далее использовать необходимые методы объекта rand.
Пример 1. Несколько случайных чисел разных типов.
public static void main(String[] args) {
Random rand = new Random();
int ix = rand.nextInt();
double dx = rand. nextDouble();
float fx = rand.nextFloat();
boolean bx = rand.nextBoolean();
System.out.println("Случайное число ix: " + ix);
System.out.println("Случайное число dx: " + dx);
System.out.println("Случайное число fx: " + fx);
System.out.println("Случайное число bx: " + bx);
Результат.
Случайное число ix: 1438841988 Случайное число dx: 0.6120986135409442 Случайное число fx: 0.103119016 Случайное число bx: true
Пример 2. Случайное число x в диапазоне a ≤ x ≤ b.
Для генерации целого случайного числа x в заданном диапазоне a ≤ x ≤ b, обычно используется следующая зависимость:
тип int int x = a + rand.nextInt(b - a + 1).
тип double double y = a + rand.nextInt(b - a).
Random rand = new Random();
int a=10;
int b=20;
int x = a + rand.nextInt(b - a + 1);
double dx = a + rand.nextDouble()*(b - a);
System.out.println("Случайное число x: " + x);
System.out.println("Случайное число dx: " + dx);
Результат.
Случайное число x: 12 Случайное число dx: 17.505847041626733
Для типа double будет выведено случайное число в виде:
dx: 17.505847041626733,
что неудобно. Для приемлемого представления используется форматный вывод, позволяющий выводить числа с заданной точностью.
Форматный вывод
Пакет java.io содержит класс PrintStream, который содержит методы printf и format, позволяющие выводить числа с заданной точностью. Рассмотрим метод format(). Синтаксис метода
System.out.format(String format, Object... args),
где:
format — это строка - шаблон, согласно которому будет происходить форматирование, args — это список переменных, для вывода по заданному шаблону.
Строка - шаблон содержит обычный текст и специальные форматирующие символы. Эти символы начинаются со знака процента (%) и заканчиваются конвертором — символом, который определяет тип переменной для форматирования. Вот некоторые конверторы:
d |
Десятичное целое |
f |
Float |
n |
переход на новую строку |
.2 |
число после точки – количество символов после запятой |
5. |
число до точки – количество символов до запятой |
Пример.
double dx= 4.56789;
System.out.format("%f%n", dx); // будет выведено 4.56789;
//два знака после запятой
System.out.format("%.2f%n", dx); // будет выведено 4.56;