В информатике детерминированный алгоритм представляет собой алгоритм который при конкретном вводе всегда будет производить один и тот же вывод, а базовая машина всегда проходит через одну и ту же последовательность состояний. Детерминированные алгоритмы на сегодняшний день являются наиболее изученным и знакомым видом алгоритмов, а также одним из наиболее практичных, поскольку их можно эффективно запускать на реальных машинах.
Формально детерминированный алгоритм вычисляет математическую функцию ; функция имеет уникальное значение для любого входа в ее домене, а алгоритм - это процесс, который производит это конкретное значение в качестве выходных данных.
Детерминированные алгоритмы могут быть определены в терминах конечного автомата : состояние описывает, что такое машина происходит в определенный момент времени. Конечные автоматы дискретным образом переходят из одного состояния в другое. Сразу после того, как мы вводим ввод, машина находится в исходном состоянии или состоянии запуска. Если машина детерминирована, это означает, что с этого момента ее текущее состояние определяет, каким будет ее следующее состояние; его ход через множество состояний предопределен. Обратите внимание, что машина может быть детерминированной и при этом никогда не останавливаться или заканчиваться и, следовательно, не давать результата.
Примеры конкретных абстрактных машин, которые являются детерминированными, включают детерминированную машину Тьюринга и детерминированный конечный автомат.
Множество факторов могут привести к тому, что алгоритм будет вести себя недетерминированным или недетерминированным образом:
Хотя настоящие программы редко бывают чисто детерминированными, людям, а также другим программам легче рассуждать о программах, которые существуют. По этой причине большинство языков программирования и особенно языков функционального программирования прилагают усилия, чтобы предотвратить указанные выше события, кроме как в контролируемых условиях.
Преобладание многоядерных процессоров привело к всплеску интереса к детерминизму в параллельном программировании, и проблемы недетерминизма были хорошо задокументированы. Был предложен ряд инструментов, которые помогут справиться с проблемами, чтобы справиться с взаимоблокировками и состояниями гонки.
В некоторых случаях это полезно для программа для демонстрации недетерминированного поведения. Поведение программы тасования карт, используемой, например, в игре блэкджек, не должно быть предсказуемо игроками, даже если исходный код программы виден. Использование генератора псевдослучайных чисел часто недостаточно для того, чтобы игроки не могли предсказать результат тасования. Умный игрок может точно угадать числа, которые выберет генератор, и, таким образом, заранее определить все содержимое колоды, позволяя ему обмануть; например, Software Security Group в Reliable Software Technologies смогла сделать это для реализации Texas Hold 'em Poker, распространяемой ASF Software, Inc, что позволяет им заранее предсказывать исход рук. Этих проблем можно частично избежать за счет использования криптографически безопасного генератора псевдослучайных чисел, но все же необходимо, чтобы непредсказуемое случайное начальное число использовалось для инициализации генератор. Для этой цели требуется источник недетерминизма, например, обеспечиваемый аппаратным генератором случайных чисел .
. Обратите внимание, что отрицательный ответ на проблему P = NP не будет означать, что программы с недетерминированными выход теоретически более мощный, чем с детерминированным выходом. Класс сложности NP (сложность) может быть определен без какой-либо ссылки на недетерминизм с использованием определения на основе верификатора.
Эта логика- язык функционального программирования устанавливает разные категории детерминизма для режимов предикатов, как объяснено в ссылке
Haskell предоставляет несколько механизмов:
Как показано в Standard ML, OCaml и Scala