Генерація випадкових чисел у Java

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr

Генерация случайных чисел в 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.

Тож, якщо вам необхідно згенерувати випадкові числа із проміжку [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 включно):

 

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr

Facebooktwittergoogle_plustumblrFacebooktwittergoogle_plustumblr
Самоучители--узнать детальнее--