— На Бейсике можно использовать дополнительную переменную Z:
FOR Z = 1 ТО 0
заменяет ВЫПОЛНЯТЬ
LET Z = 0
заменяет КОНЧЕНО
NEXT Z
заменяет ВЕРНУТЬСЯ
Кроме того, нужно перепрыгнуть в цикле все, что стоит после слова КОНЧЕНО, т. е. после оператора LET Z = 0. Так как это можно сделать с помощью GO ТО, то я считаю предпочтительным использовать таким образом GO ТО для циклов. Если ваш язык не структурирован, то красивых циклов вы никогда не получите…
— На языке Паскаль используйте булеву переменную
WHILE
Слово КОНЧЕНО придется заменить оператором
Цикл
ДЛЯ
ВЕРНУТЬСЯ
повторяет последовательность операторов, заключенную между ВЫПОЛНЯТЬ и ВЕРНУТЬСЯ, придавая
Часть I. Условия задач
1. Случайные числа
Генерация случайного числа
Можно сделать из этого настоящую головоломку: написать программу, выполнение которой на компьютере дает число, случайным образом расположенное в данном интервале, например, между 0 и 1. Но это невозможно.
Некоторые языки содержат функцию, значение которой есть непредсказуемое число в данном интервале. Если ваш компьютер использует LSE, достаточно набрать на клавиатуре
? ALE(0)
чтобы получить в ответ непредсказуемое число между 0 и 1, которое может рассматриваться как полученное случайным образом.
На языке Бейсик команда RND(0) дает тот же эффект при условии, что предварительно выполнена инструкция RANDOM. Но Бейсик — это скорее общее имя для целого класса языков, чем обозначение совершенно определенного стандартизованного языка, не меняющегося от одной машины к другой. Так что сверьтесь с описанием к вашему компьютеру…
Если используемый вами язык допускает описанные выше или аналогичные возможности, то получить случайное число в интервале (0, 1) — это никакая не головоломка, это тривиально.
Но если в языке такой возможности нет,; то это больше чем головоломка, это невозможно. Предположим, что мы сделали программу, производящую такое число. Эта программа не может иметь исходных данных, иначе это не она вытаскивает, случайное число, а именно вы при введении данных… Если же у нее нет данных, то она действует, исходя из констант. Но тогда нет переменных элементов, и последовательные запуски программы дают совпадающие результаты. Как же вы получите с помощью такой программы случайное число?[2]
Поэтому если ваш компьютер не допускает функции, дающей стохастическое число, я вижу только одно решение[3]: введите сами случайное число в ваш компьютер. Как это сделать? Вот предложение. Вы берете колоду из 52 карт, перетасовываете. Затем вы делите колоду на верхнюю и нижнюю части и берете из нижней части три верхние карты. Небольшая и очень простая программа читает три целых числа
(((x − 1)/13 + у − 1)/13 + z − 1)/13.
Например, если вы достанете, как только что случилось со мной, семерку бубен, десятку червей и еще шестерку бубен, то
и компьютер получит 0.440601.
Эго значение не является воистину непредсказуемым. Как только вы достанете карты, вы уже сможете понять порядок величины результата. С другой стороны, таким способом вы не сможете получить более 13³ = 2197 различных чисел. Но этого на самом деле достаточно для приложений, которые мы рассматриваем в этой книге. А если вы и в самом деле хотите получить что-либо непредсказуемое, прочтите следующий раздел.
Непредсказуемые числовые последовательности
Редко бывает нужно получить только одно случайное число. Чаще нужно получить много таких чисел. Большая часть игр, представленных в этой книге, требует, чтобы играющий с компьютером по ходу игры встречался, сообразно с предложенными правилами, с непредсказуемыми ситуациями. Нужно уметь порождать такие ситуации.
Поэтому нужно иметь возможность построить такую последовательность чисел, чтобы переход от одного числа к другому определялся простыми вычислительными правилами, но чтобы в то же время результат было трудно предсказать.
Может случиться, что используемый вами язык предоставляет эту возможность непосредственно в виде одной из конструкций языка.