JavaRush/Java блог/Random UA/Генерація випадкового числа у заданому діапазоні
L2CCCP
9 рівень

Генерація випадкового числа у заданому діапазоні

Стаття з групи Random UA
учасників
Привіт по той бік екрану. Будь-який з нас рано чи пізно зустрічається з необхідністю генерувати випадкове число в заданому нами діапазоні чи то речове чи ціле число. Генерація випадкового числа у заданому діапазоні - 1Для чого? Насправді це не важливо, це може бути функція для розрахунку шансу для запуску якоїсь події, отримання випадкового множника або будь-яка інша. Отже, навіщо це потрібно розібралися, саме для чого завгодно :) Насправді методів отримання псевдовипадкового числа дуже багато, я наведу приклад із класом Math, саме з методом random(); Що ми маємо? Виклик методу Math.random()повертає псевдовипадкове речове число ( double) з діапазону[0;1), тобто, від 0 до 1 за винятком 1, а значить максимальне число в діапазоні це 0.99999999999... Добре, ми отримали псевдовипадкове число, але якщо нам потрібен свій діапазон? Наприклад, нам потрібне псевдовипадкове число з діапазону [0; 100)? Пишемо код:
public static void main(String... args)
{
	final double max = 100.; // Максимальное число для диапазона от 0 до max
	final double rnd = rnd(max);

	System.out.println("Псевдослучайное вещественное число: " + rnd);
}

/**
 * Метод получения псевдослучайного вещественного числа от 0 до max (исключая max);
 */
public static double rnd(final double max)
{
	return Math.random() * max;
}
Вийшло непогано, але max(у нашому випадку) ми все одно не отримаємо. Для того щоб отримати випадкове число в діапазоні [0;100] нам необхідно додати до нашого max1, а потім перетворити на ціле число типу intабо long(залежить від діапазонів, які Ви будете використовувати). Пишемо код:
public static void main(String... args)
{
	final int max = 100; // Максимальное число для диапазона от 0 до max
	final int rnd = rnd(max);

	System.out.println("Псевдослучайное целое число: " + rnd);
}

/**
 * Метод получения псевдослучайного целого числа от 0 до max (включая max);
 */
public static int rnd(int max)
{
	return (int) (Math.random() * ++max);
}
Примітка: Як бачите, змінна max була інкрементована префіксною формою. (Якщо Ви не знаєте що це раджу почитати мою статтю ) Відмінно, ми отримали те, що хотіли, але якщо нам потрібен діапазон не від 0, а наприклад [10; 75] Пишемо код:
public static void main(String... args)
{
	final int min = 10; // Минимальное число для диапазона
	final int max = 75; // Максимальное число для диапазона
	final int rnd = rnd(min, max);

	System.out.println("Псевдослучайное целое число: " + rnd);
}

/**
 * Метод получения псевдослучайного целого числа от min до max (включая max);
 */
public static int rnd(int min, int max)
{
	max -= min;
	return (int) (Math.random() * ++max) + min;
}
Розбір коду з методу rnd:

Минимальное число диапазона = 10;
Максимальное число диапазона = 75;
max -= min; // Отнимаем от максимального значения минимальное для получения множителя псевдослучайного вещественного числа.
Максимальне число після розрахунку дорівнює 65 Псевдовипадкове матеріальне число (наприклад) дорівнює 0.18283417347179454 (Було отримано при виклику Math.random()). Максимальне число перед множенням було інкрементовано префіксною формою. Максимальне число тепер 66 Множимо 0.18283417347179454 на 66. Результат множення дорівнює 12.06705544913844. Перетворюємо результат множення максимального числа на псевдовипадкове речове число до типу цілого числаint. Додаємо мінімальне число до перетвореного результату який дорівнює 12. Повертаємо результат: 22 Як видно з розбору, навіть якщо псевдовипадкове речове число дорівнюватиме нулю, то ми повернемо наш мінімум в результаті складання нашого мінімального числа з результатом множення. Сподіваюся для Вас це було корисно та пізнавально. Успіхів в освоєнні Java ;) Ще пару моїх статей: Що таке інкрементування та декрементування Оператор поділу по модулю
Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.