/
Программирование
/
Курс Java
/

Детерминированность

Java: Детерминированность

У методов в любом языке программирования есть фундаментальные свойства. Эти свойства помогают понять, как метод поведет себя в разных ситуациях, как его тестировать и где применять. Одним из таких свойств является детерминированность.

Детерминированный метод всегда возвращает один и тот же результат при одинаковых входных данных. Например, детерминированным можно назвать метод, который извлекает символ из строки по его позиции:

"wow".charAt(1); // 'o'
"wow".charAt(1); // 'o'

"hexlet".charAt(0); // 'h'
"hexlet".charAt(0); // 'h'

Сколько бы раз мы ни вызывали charAt() с аргументом 1 для строки "wow", он всегда вернет 'o'. Результат зависит только от входных данных и не меняется от вызова к вызову.

Недетерминированные методы

К противоположному типу относятся недетерминированные методы. Они возвращают разные результаты при одинаковых входных данных или при их отсутствии (методы без аргументов). Хорошим примером служит метод, который возвращает случайное число:

// Метод, возвращающий случайное число
Math.random(); // 0.09856613113197676
Math.random(); // 0.8839904367241888

У этого метода нет аргументов, но его результат каждый раз разный. Насколько он разный, не важно. Даже если хотя бы один вызов среди миллиона даст другой результат, метод считается недетерминированным.

Детерминированный:           Недетерминированный:
"wow".charAt(1) → всегда 'o'  Math.random() → 0.42
"wow".charAt(1) → всегда 'o'  Math.random() → 0.91
"wow".charAt(1) → всегда 'o'  Math.random() → 0.07

Почему это важно

Детерминированность влияет на то, как мы работаем с методами.

  • детерминированные методы легко тестировать и предсказывать;
  • их проще оптимизировать и использовать повторно;
  • недетерминированные методы сложнее проверять, потому что результат меняется.

Поэтому там, где это возможно, лучше стремиться к тому, чтобы метод оставался детерминированным.

Задание

Метод Math.random() возвращает случайное число от 0 до 1 с большим количеством знаков после запятой. Но в реальных задачах бывает нужно получать случайные целые числа. Реализуйте код, который печатает на экран случайное целое число от 0 до 10. Чтобы получить такое число, нужно умножить результат вызова Math.random() на 10 и преобразовать тип полученного числа из double в int.

// Преобразование в int
(int) 0.932342; // 0
(int) 8.123412; // 8

Попробуйте решить это задание в одну строчку

Полезное

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются