Генерация случайных чисел в Java

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr

Генерация случайных чисел в Java

Данная статья:

  • написана командой Vertex Academy. Надеемся, что она Вам будет полезна. Приятного прочтения!
  • это одна из статей из нашего "Самоучителя по Java"

Генерация случайных чисел в Java - важная и нужная тема. Действительно, она Вам понадобится неисчислимое количество раз.

Например:

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

Давайте же разберемся с этой темой.

Существует несколько способов как сгенерировать случайное число. В этой статье мы рассмотрим генерацию чисел с помощью Math.random() 

В библиотеке классов Java есть пакет java.lang, у которого есть класс Math, а у класса Math есть метод random(). См. картинку ниже в помощь.

Генерация случайных чисел в Java_vertex

Так вот, при каждом вызове Math.random() c помощью специального алгоритма (за определенной инструкцией) генерируется случайное число. Можно ли предсказать какое число будет сгенерировано? Теоретически это возможно, но это очень трудно сделать. А поскольку все-таки существует небольшая вероятность предсказать, какое же число будет сгенерировано алгоритмом, такие числа принято называть не случайными, а псевдослучайными. 

Вы должны знать 3 момента:

1. По умолчанию Math.random() генерирует случайные вещественные числа из промежутка [0;1), то есть от нуля включительно до 1 исключительно.

"До 1 исключительно" - это значит, что Math.random() не может сгенерировать число 1. Разве что 0,999 - то есть любое число меньше 1.Попробуйте запустить на своем компьютере вот этот код и сами увидите, что в консоль будут выводиться вещественные числа от 0 до любого числа, меньше 1.

Так что если Вам необходимо сгенерировать случайные числа из промежутка [0;1), Вы уже знаете как это сделать.

2. А что если нам необходимо сгенерировать числа из другого диапазона, отличного от [0;1)?

Легко! Давайте формально запишем наш диапазон: [a;b). То есть нижняя граница а, верхняя b. Тогда для генерации вещественных чисел в заданном диапазоне нужно записать следующее:

( Math.random() * (b-a) ) + a

Рассмотрим на примерах.

Пример №1

Итак, чтобы получить случайное вещественное число из промежутка [0;3), (3 исключительно), используем:

Как это работает?

Диапазон [0;1) умножается на 3. Соответственно,
Нижняя граница: 0*3 = 0
Верхняя граница: 1*3 = 3

Получаем диапазон [0;3)

Если применить нашу формулу, получим:

( Math.random() * (3 - 0) ) + 0  =>  Math.random() * 3

Что и отображено в программе.


Пример №2

Допустим, нам необходимо получить число с плавающей точкой в интервале [ 2; 3) (3 исключительно)

Как это работает?

К диапазону [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: Диапазон [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 исключительно)

По формуле:
( Math.random() * (100 - (-100)) ) + (-100)  =>  Math.random() * 200 - 100


3. А как сгенерировать целочисленное значение?

Пример №5

Представим, что нам необходимо сгенерировать число в интервале [0;2]. Обратите внимание, что после 2 скобка квадратная, а не круглая. Это значит, что нас интересует, чтоб диапазон включал в себя число 2. Как это сделать? Вот так:

Как это работает?

Шаг №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: Диапазон [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 включительно):

Пример №8

Целочисленное значение в интервале [ -200; 400] (400 включительно):

Пример №9

Целочисленное значение в интервале [ 1; 2] (2 включительно):


Надеемся, что наша статья была Вам полезна. Также есть возможность записаться на наши курсы по Java в Киеве. Обучаем с нуля. Детальную информацию Вы можете найти у нас на сайте.

 

 

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr