Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Yan_Shrayber_-_vse_3.docx
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
8.77 Mб
Скачать

Псевдослучайные числа

С компьютерами похожие проблемы, ведь, как я уже упоминал во вступлении, в устройстве компьютера вообще не бывает случайностей. Только нули и единицы, только высокое и низкое напряжение, бегущее по проводам и хранимое электромагнитным способом где-то на диске памяти – всё это детерминировано. И если вы не собираетесь устанавливать какой-либо прибор, который измеряет некий произвольно меняющийся параметр некоего физического явления – счётчик Гейгера, отслеживающий радиационное излучение или что-то подобное (а большинство из нас не собирается ничего такого предпринимать) – у вас неразрешимая проблема: как заставить детерминированную машину разыгрывать недетерминированные шансы в игре.

Выкрутиться можно при помощи несложной математики, которую я здесь приводить не буду (если вам интересно, достаточно загуглить «алгоритмы псевдослучайных чисел»). Всё, что вам нужно знать – это то, что существуют некоторые математические функции, которые ведут себя достаточно беспорядочно, без какой-либо заметной закономерности, так что можно просто взять один из результатов этой функции с назвать его случайным числом.

Как знать какой результат функции нам взять? Да любой случайный. Шучу, конечно. Как я и сказал, этого сделать невозможно. Так что вместо этого, вы говорите компьютеру, какой результат ему взять, а потом, когда начало будет положено, если вам ещё раз потребуется случайное число, он просто возьмёт следующее в последовательности, а потом следующее, и следующее, и так далее. Но так как мы сказали ему, с чего начать, всё это уже неслучайно, даже если игроку со стороны так кажется. То число, с которого вы сказали своему компьютеру начать, называется «зерном», и как только вы задали компьютеру одно инициирующее зерно, с него он начинает выбирать числа из последовательности. Достаточно сделать это лишь однажды. Но… и это важно… если вы зададите то же зерно ещё раз, результаты будут точно такими же. Помните, здесь всё детерминировано!

Обычно мы выкручиваемся выбирая в качестве зерна число, которое игроку будет сложно повторить, например, число миллисекунд, которые истекли с момента наступления полночи или что-то подобное. Но выбирать надо очень осторожно. Например, если вы выберете зерном дробное значение миллисекунды из часов системы (от 0 до 999), то в вашей игре будет лишь 1000 вариантов «перетасовки», и этого достаточно для того, чтобы при многократной игре ваш пользователь ощутил дежа-вю от двух подозрительно похожих друг на друга игровых сессий. Если ваша игра соревновательная, достаточно мотивированный игрок может изучить вашу игру настолько, что будет уметь предсказывать, какое число когда выпадет и использовать это для получения нечестного преимущества. Так что при создании подобных систем надо быть очень осторожными.

Псевдослучайные числа в онлайн играх: синхронизация клиентов

В онлайн играх со случайными числами надо быть ещё осторожнее, если компьютеры ваших игроков генерируют свои собственные случайные числа. Я работал над играми двух компаний, которые, к худу ли, к добру ли, были спроектированы таким образом. Могло произойти вот что: один игрок (или сервер) мог сгенерировать «зерно», и то же самое зерно использовалось для обоих соперников в игре один на один. Тогда, если кому-либо из игроков требовалось случайное число, обе машины должны были сгенерировать это число, чтобы их случайные числа были идентичны. Иногда из-за какого-то сбоя, один из игроков генерировал случайное число и забывал сказать об этом сопернику, и тогда их генераторы случайных числе оказывались рассинхронизированы. Игра продолжалась какое-то время, пока внезапно один из игроков не предпринимал действия, требующего элемента случайности, его машина выдаёт «успех», машина оппонента (с другим случайным числом) – «неудача», оба клиента сравнивают контрольные суммы, которые не сходятся, потому что у них теперь разное состояние игры, и каждый из игроков уверен, что другой пытался сжульничать. Упс. (Для компьютерных игр лучше всего в таких случаях всю игровую логику поместить на сервере и использовать тонкие клиенты. Для сетевых игр на консолях или телефонах, где нет сервера, а устройства соединяются друг с другом напрямую, поручите устройству одного из игроков управлять всеми этими вещами и просто передавать необходимую информацию другим игрокам).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]