Генерация случайных чисел в Java
Данная статья:
- написана командой Vertex Academy. Надеемся, что она Вам будет полезна. Приятного прочтения!
- это одна из статей из нашего "Самоучителя по Java"
Генерация случайных чисел в Java - важная и нужная тема. Действительно, она Вам понадобится неисчислимое количество раз.
Например:
- при заполнении массива случайными числами
- при перетасовке колоды карт
- при выборе случайного элемента из последовательности
- и т.д.
Давайте же разберемся с этой темой.
Существует несколько способов как сгенерировать случайное число. В этой статье мы рассмотрим генерацию чисел с помощью Math.random()
В библиотеке классов Java есть пакет java.lang, у которого есть класс Math, а у класса Math есть метод random(). См. картинку ниже в помощь.
Так вот, при каждом вызове Math.random() c помощью специального алгоритма (за определенной инструкцией) генерируется случайное число. Можно ли предсказать какое число будет сгенерировано? Теоретически это возможно, но это очень трудно сделать. А поскольку все-таки существует небольшая вероятность предсказать, какое же число будет сгенерировано алгоритмом, такие числа принято называть не случайными, а псевдослучайными.
Вы должны знать 3 момента:
1. По умолчанию Math.random() генерирует случайные вещественные числа из промежутка [0;1), то есть от нуля включительно до 1 исключительно.
"До 1 исключительно" - это значит, что Math.random() не может сгенерировать число 1. Разве что 0,999 - то есть любое число меньше 1.Попробуйте запустить на своем компьютере вот этот код и сами увидите, что в консоль будут выводиться вещественные числа от 0 до любого числа, меньше 1.
1 2 3 4 5 6 7 |
public class Test { public static void main(String[] args){ double a = Math.random(); System.out.println (a); } } |
Так что если Вам необходимо сгенерировать случайные числа из промежутка [0;1), Вы уже знаете как это сделать.
2. А что если нам необходимо сгенерировать числа из другого диапазона, отличного от [0;1)?
Легко! Давайте формально запишем наш диапазон: [a;b). То есть нижняя граница а, верхняя b. Тогда для генерации вещественных чисел в заданном диапазоне нужно записать следующее:
( Math.random() * (b-a) ) + a
Рассмотрим на примерах.
Пример №1
Итак, чтобы получить случайное вещественное число из промежутка [0;3), (3 исключительно), используем:
1 2 3 4 5 6 7 |
public class Test { public static void main(String[] args){ double a = Math.random()*3; System.out.println(a); } } |
Как это работает?
Диапазон [0;1) умножается на 3. Соответственно,
Нижняя граница: 0*3 = 0
Верхняя граница: 1*3 = 3
Получаем диапазон [0;3)
Если применить нашу формулу, получим:
( Math.random() * (3 - 0) ) + 0 => Math.random() * 3
Что и отображено в программе.
Пример №2
Допустим, нам необходимо получить число с плавающей точкой в интервале [ 2; 3) (3 исключительно)
1 2 3 4 5 6 7 |
public class Test { public static void main(String[] args){ double a = Math.random()+2; System.out.println(a); } } |
Как это работает?
К диапазону [0;1) прибавляем 2. Соответственно,
Нижняя граница: 0 + 2 = 2
Верхняя граница: 1 + 2 = 3
Получаем диапазон [2;3)
Согласно формуле:
( Math.random() * (3 - 2) ) + 2 => Math.random() * 1 + 2 => Math.random() + 2
Пример №3
Допустим, нам необходимо получить вещественное число в интервале [ 20; 60) (60 исключительно)
1 2 3 4 5 6 7 |
public class Test { public static void main(String[] args){ double a = 20 + Math.random()*40; System.out.println(a); } } |
Как это работает?
Шаг №1: Диапазон [0;1) умножается на 40. Соответственно,
Нижняя граница: 0*40 = 0
Верхняя граница: 1*40 = 40
Получаем диапазон [0;40)
Шаг №2: К диапазону [0;40) прибавляем 20. Соответственно,
Нижняя граница: 0 + 20 = 20
Верхняя граница: 40 + 20 = 60
Получаем диапазон [20;60)
Если просто подставить в формулу, то получим:
( Math.random() * (60 - 20) ) + 20 => Math.random() * 40 + 20
Пример №4
Вещественное число в интервале[ -100; +100) (100 исключительно)
1 2 3 4 5 6 7 |
public class Test { public static void main(String[] args){ double a = Math.random()*200 - 100; System.out.println(a); } } |
По формуле:
( Math.random() * (100 - (-100)) ) + (-100) => Math.random() * 200 - 100
3. А как сгенерировать целочисленное значение?
Пример №5
Представим, что нам необходимо сгенерировать число в интервале [0;2]. Обратите внимание, что после 2 скобка квадратная, а не круглая. Это значит, что нас интересует, чтоб диапазон включал в себя число 2. Как это сделать? Вот так:
1 2 3 4 5 |
public class Test { public static void main(String[] args){ int a = (int) ( Math.random() * 3 ); } } |
Как это работает?
Шаг №1: Диапазон [0;1) умножаем на 3. Соответственно,
Нижняя граница: 0*3 =0
Верхняя граница:1*3 =3
Получили диапазон [0;3). Скобка после числа 3 круглая. Это значит, что 3 не входит в диапазон, то есть максимальное число, которое может быть сгенерировано в этом диапазоне это 2,999. Одним словом - мы имеем дело с вещественными (дробными) числами.
Шаг №2: Поэтому применяем (int) перед Math.random()*3. Дробная часть отсекается и мы получаем диапазон [0;2]
Если рассмотреть нашу формулу, то она не очень сильно поменяется.
В случае, если вещественное число, и верхний диапазон включает b - [a;b] :
( Math.random() * (b - a + 1) + a
Если еще и только целые числа:
(int)(( Math.random() * (b - a + 1) + a)
Пример №6
Если необходимо сгенерировать число из интервала [3;4]. Обратите внимание, что после 4 скобка квадратная. Это значит, что нас интересует, чтоб диапазон включал в себя число 4. Как это сделать? Вот так:
1 2 3 4 5 |
public class Test { public static void main(String[] args){ int a = 3 + (int) ( Math.random() * 2 ); } } |
Как это работает?
Шаг №1: Диапазон [0;1) умножаем на 2. Соответственно,
Нижняя граница:0*2 =0
Верхняя граница:1*2 =2
Получили диапазон [0;2). Скобка после числа 2 круглая. Это значит, что 2 не входит в диапазон, то есть максимальное число, которое может быть сгенерировано в этом диапазоне это 1,999. А это значит, что мы имеем дело с вещественным (дробным) числом.
Шаг №2: Поэтому применяем (int) перед Math.random()*2. Дробная часть отсекается и мы получаем диапазон [0;1]. Обратите внимание - диапазон уже по число 1 включительно.
Шаг №3: Далее к диапазону [0;1] прибавляем 3. Соответственно,
Нижняя граница: 0+3 = 3
Верхняя граница: 1+3 =4
Получили новый диапазон [3;4]
По формуле:
(int)(Math.random() * (4 - 3 + 1) + 3) => (int)(Math.random() *2 + 3)
Пример №7
Целочисленное значение в интервале [ -100; +100](100 включительно):
1 2 3 4 5 6 7 |
public class Test { public static void main(String[] args){ int a = (int) (Math.random()*(200+1)) - 100; System.out.println(a); } } |
Пример №8
Целочисленное значение в интервале [ -200; 400] (400 включительно):
1 2 3 4 5 6 7 |
public class Test { public static void main(String[] args){ int a = (int) (Math.random()*(600+1)) - 200; System.out.println(a); } } |
Пример №9
Целочисленное значение в интервале [ 1; 2] (2 включительно):
1 2 3 4 5 6 7 |
public class Test { public static void main(String[] args){ int a = (int) (Math.random()*(1+1)) + 1; System.out.println(a); } } |
Надеемся, что наша статья была Вам полезна. Также есть возможность записаться на наши курсы по Java в Киеве. Обучаем с нуля. Детальную информацию Вы можете найти у нас на сайте.