В информатике детерминированный алгоритм — это алгоритм , который при определенных входных данных всегда будет выдавать один и тот же результат, при этом базовая машина всегда проходит через одну и ту же последовательность состояний. Детерминированные алгоритмы на сегодняшний день являются наиболее изученным и знакомым типом алгоритмов, а также одним из наиболее практичных, поскольку их можно эффективно запускать на реальных машинах.
Формально детерминированный алгоритм вычисляет математическую функцию ; функция имеет уникальное значение для любого входного значения в своей области определения , а алгоритм представляет собой процесс, который создает это конкретное значение в качестве выходного.
Детерминированные алгоритмы можно определить в терминах конечного автомата : состояние описывает, что машина делает в конкретный момент времени. Конечные автоматы дискретно переходят из одного состояния в другое. Сразу после того, как мы вводим ввод, машина находится в исходном или стартовом состоянии . Если машина детерминирована, это означает, что с этого момента ее текущее состояние определяет, каким будет ее следующее состояние; ее ход через множество состояний предопределен. Обратите внимание, что машина может быть детерминированной и при этом никогда не останавливаться и не заканчивать работу и, следовательно, не обеспечивать результат.
Примеры конкретных абстрактных машин , которые являются детерминированными, включают детерминированную машину Тьюринга и детерминированный конечный автомат .
Множество факторов могут привести к тому, что алгоритм будет вести себя недетерминированным или недетерминированным образом:
Хотя реальные программы редко являются чисто детерминированными, людям, как и другим программам, легче рассуждать о программах, которые таковыми являются. По этой причине большинство языков программирования , и особенно языки функционального программирования, стараются предотвратить возникновение вышеупомянутых событий, за исключением контролируемых условий.
Распространенность многоядерных процессоров привела к всплеску интереса к детерминизму в параллельном программировании, а проблемы недетерминизма хорошо документированы. [1] [2] Был предложен ряд инструментов, которые помогут справиться с проблемами [3] [4] [5] [6] для борьбы с взаимоблокировками и состояниями гонки .
В некоторых случаях выгодно, чтобы программа демонстрировала недетерминированное поведение. Поведение программы перетасовки карт, используемой, например, в игре в блэкджек , не должно быть предсказуемым для игроков — даже если исходный код программы виден. Использование генератора псевдослучайных чисел часто недостаточно, чтобы гарантировать, что игроки не смогут предсказать результат тасования. Умный игрок может точно угадать числа, которые выберет генератор, и таким образом заранее определить все содержимое колоды, что позволит ему обмануть; например, группа безопасности программного обеспечения компании Reliable Software Technologies смогла сделать это для реализации игры в техасский холдем-покер, распространяемой компанией ASF Software, Inc, что позволило им последовательно предсказывать исход раздач заранее. [7] Частично этих проблем можно избежать за счет использования криптографически безопасного генератора псевдослучайных чисел , но все равно необходимо использовать непредсказуемое случайное начальное число для инициализации генератора. Для этой цели необходим источник недетерминированности, например, обеспечиваемый аппаратным генератором случайных чисел .
Обратите внимание: отрицательный ответ на проблему P=NP не будет означать, что программы с недетерминированным выходом теоретически более мощны, чем программы с детерминированным выходом. Класс сложности NP (сложность) можно определить без какой-либо ссылки на недетерминизм, используя определение на основе верификатора .
Язык функционально-логического программирования Mercury устанавливает различные категории детерминизма для режимов предикатов, как описано в ссылке. [8] [9]
Haskell предоставляет несколько механизмов:
Как видно из Standard ML , OCaml и Scala.
В Java значение нулевой ссылки может представлять неудачный результат (вне домена).