Генерація випадкових чисел у Java
Генерація випадкових чисел у Java - важлива і потрібна тема. Дійсно, вона Вам знадобиться незліченну кількість разів.
Наприклад:
- при заповненні масиву випадковими числами
- при перетасуванні колоди карт
- при виборі випадкового елемента з послідовності
- і т.д.
Розберемося з цією темою.
Існує кілька способів, як згенерувати випадкове число. У цій статті ми розглянемо генерацію чисел за допомогою Math.random()
У бібліотеці класів Java є пакет java.lang, у якого є клас Math, а у класу Math є метод random ().. Див. картинку нижче в допомогу.
Так ось, при кожному виклику Math.random () з допомогою спеціального алгоритму (за певною інструкцією) генерується випадкове число. Чи можна передбачити, яке число буде згенеровано? Теоретично це можливо, але це дуже важко зробити. А оскільки все-таки існує невелика ймовірність передбачити, яке ж число буде згенеровано алгоритмом, такі числа прийнято називати не випадковими, а псевдовипадковими.
Ви повинні знати 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); } } |