Составьте программу, которая позволит человеку играть против компьютера. Эта программа реализует бросание кости. На своем ходе она честна и не мошенничает. На вашем ходе она бросает кость и сообщает^ что выпало, а вы требуете следующего бросания, если вы хотите играть дальше.
Задача о стратегии ясна. Вы можете, например, бросать кость ровно один раз. У вас хорошие шансы увеличить свою сумму, но на небольшое число очков (от 2 до 6). Если вы делаете несколько бросаний, вы увеличиваете шанс получить большую сумму, но вы увеличиваете и риск выбросить единицу. Стратегия играющего против компьютера — это его проблема, и программа компьютера во всех этих рассмотрениях не участвует. Она играет по команде человека, он говорит, хочет ли он продолжать — под его личную ответственность.
Напротив, программа должна быть снабжена стратегией для управления игрой компьютера. Возможностей много. Выбирать следует вам.
Программирование этой .игры представляет двоякий интерес;
— нужно придумать стратегию для компьютера;
— у вас есть возможность экспериментировать. Если компьютер снабжен некоторой стратегией, то вы можете играть против него с другой стратегией и посмотреть, кто выигрывает…
Вы можете также захотеть переиграть партию с тем .же началом, что и в предыдущей партии, но вводя в вашу игру изменения, чтобы изучить последствия. Это приводит к новому понятию.
Воспроизводимая непредсказуемая последовательность
Вы научились порождать последовательности непредсказуемых чисел, или, допуская неточность речи, принятую в информатике, случайных чисел (эти последовательности совершенно не случайны; они полностью детерминированы, но, поскольку мы не можем найти простого способа перехода от данного числа к следующему и поскольку эти числа приблизительно регулярно размещены в промежутке 0 : 1, то они производят впечатление случайности). Каждое число в этой последовательности зависит только от предыдущего числа. К тому же, как и выше, вы можете получить и в самом деле непредсказуемое число, задавая компьютеру значения трех карт. Вы заставляете его вычислить значение, определенное в разд. 1.1, затем вы берете следующее за этим значением либо с помощью функции ALE или RND вашего компьютера, либо с помощью метода, описанного в разд. 1.2.
Эти последовательности случайных чисел таковы, что каждое число в последовательности зависит только от предшествующего ему и задание начального элемента последовательности полностью определяет последовательность. При отправлении из одной и той же точки два последовательно проведенных вычисления дают одинаковые последовательности. Таким образом, вы не только можете получить в играх непредсказуемые ситуации, но и воспроизвести их столько раз, сколько вам нужно. Для этого нужно, чтобы программа требовала ввести исходное значение последовательности. Я считаю удобным вывести приглашение приблизительно такого рода:
ВВЕДИТЕ ТРЕХЗНАЧНОЕ ЦЕЛОЕ
затем прочесть значение x этого целого и взять в качестве начального значения случайной последовательности число x /1000.
Исходя из генератора случайных чисел, можно легко построить последовательность целых чисел. Название функции, порождающей случайные числа, меняется от языка к языку; назовем ее
ale ( x )
— это функция, сопоставляющая x , 0 ≤ x < 1, следующее за ним число
0 ≤ ale ( x ) < 1.
Построим теперь последовательность неотрицательных целых чисел, меньших данного числа n . У нас есть две возможности.
1. Мы порождаем последовательность случайных чисел в интервале (0, 1) и для каждого из чисел последовательности получаем соответствующее целое
x := ale ( x ), p = целая_часть( n * x ).
Различные значения x могут давать одно и то же значение p , так что элемент, следующий за p в последовательности целых, не определяется каким-либо предсказуемым образом. Вообще говоря, данное значение p может иметь несколько последующих значений. Маловероятно, что эта последовательность окажется периодической. Это заведомо случится, если последовательность x , определяющая ее, периодична (а это бывает, хотим мы этого или не хотим).
2. Пусть p дано; тогда p / n лежит между 0 и 1. И элемент, следующий за p , можно определить формулой
p := целая_часть (n * ale ( p / n )),
Здесь элемент, следующий за p , полностью определен числом p , и эта последовательность неизбежно оказывается периодической. В наиболее удачных случаях она дает n различных значений ( n целых от 0 до n − 1), после чего возвращается к уже встретившемуся в последовательности числу, и — так как каждое из чисел имеет однозначно определенное следующее за ним число — мы повторяем уже построенную часть последовательности. Но чаще всего этим способом получаются слишком короткопериодические последовательности.
Читать дальше