Нам потребовалось около трех недель, чтобы досконально разобраться в том, как работает программа.
Для этого мы изучали текст, делали определенные предположения о его назначении, писали некоторые добавки к программе, помещали ее в R O M (компьютерный чип) и возвращали его в машину, а потом смотрели, что происходит. Например, мы написали специальную программу, которая располагала числа над изображением карт на экране. Так мы определили, каким образом программа оперирует с картами. Н а ш а работа ш л а по м е т о д у проб, ошибок, и постоянного анализа, достаточно быстро строки кода начали наполняться смыслом. Мы досконально разобрались в том, как числа в компьютерной программе превращаются в карты на экране.
Мы надеялись, что генератор случайных чисел будет устроен достаточно просто. Дело происходило в начале девяностых годов, и это было именно так. После небольшого анализа я понял, что мы имеем дело с генератором, который Дональд К н у т написал е щ е в 60-е годы. Авторы программы для игрового автомата не стали изобретать велосипед, а просто скопировали в свою программу имеющиеся разработки по методу Монте-Карло.
Мы точно установили, какой алгоритм использовали авторы программы в своем коде для случайной выборки карт; он назывался линейным регистром сдвига с обратной связью (linear feedback shift register) и это был очень хороший генератор случайных чисел (RNG)».
Очень скоро «взломщики» поняли, что в этом генераторе случайных чисел есть очень серьезная «прореха», которая существенно упрощает их задачу. Как объяснял Майк, «это был достаточно простой 32-битный RNG, поэтому взломать его не составляло особого труда, а с помощью нескольких хороших оптимизаций стало совсем просто».
Итак, выдаваемые генератором числа не были абсолютно произвольными. Но, по мнению Алекса, есть серьезная причина для этого:
«Если они абсолютно произвольны, то не могут создавать неравные условия. Они не знают о том, что такое неравные условия. Некоторые автоматы выдают один за другим два последовательных королевских флэша (очень редкую комбинацию карт в покере — прим. переводчика). Такого не должно быть никогда. Поэтому дизайнеры хотят быть уверены, что у них правильная статистика, иначе им кажется, что они теряют контроль над игрой.
Одна вещь, которую дизайнеры не понимали, когда создавали свой автомат, заключается в том, что им и не нужен настоящий генератор случайных чисел. В любом покерном розыгрыше участвуют десять карт: пять сдаются сначала и еще пять для замены каждой из пяти по желанию игрока, В автомате эти десять карт выбирались, как десять последовательных случайных чисел в RNG».
Итак, Алекс и его партнеры поняли, что программа в том автомате, который они изучали, недостаточно продумана. Из-за наличия ошибок стало ясно, что они могут написать несложный, но элегантный алгоритм, который поможет им победить машину.
Идея, по мнению Алекса, заключалась в том, чтобы начать игру, увидеть, какой набор карт выбросил автомат, и ввести эти сведения в свой компьютер. Затем с помощью разработанного алгоритма вычислить положение, в котором находится генератор случайных чисел, и определить, сколько ему еще номеров осталось до того, как будет выброшена комбинация, соответствующая королевскому флэшу.
«Итак, мы работали на нашей тестовой машине и пробовали нашу маленькую программу, которая точно предсказывала нам следующие последовательности карт. Возбуждение нарастало».
Алекс приписывает это возбуждение «осознанию того, что вы умнее кого-то и можете переиграть его. А в нашем случае еще и заработать немного денег».