Здравствуйте, хочу рассказать о проблеме с которой недавно столкнулась наша команда и о том как нам пришлось учавствовать в подтасовке результатов лотереи.
Итак, в первую же неделю нового года нам поставили простую, но срочную задачу. Некая иностранная компания, занимающаяся кинопрокатом, решила привлечь людей на новый неприметный фильмец, разыграв билеты на него среди своих посетителей. Для этого на партии свежих билетов (1 миллион штук) полагалось нанести уникальные буквенные коды достаточной длинны, что бы обеспечить неподбираемость. Покупатели должны вводить их на специальной страничке сайта (вместе с почтовым индексом, что бы направить человека в ближайший кинотеатр, если он выиграл). Наши иностранные коллеги предоставили нам файлик со списком кодов и сказали взять первые попавшиеся 500 и использовать их в качестве выигрышных (на 1 выигрышный код полагалось 4 места в кинотеатре). Поскольку невыигрышные билеты нас не интересовали, а клиенту было совершенно всё равно кто выиграет, мы поместили в нашу базу данных 500 строчек с кодами и написали необходимую логику для проверки кодов и раздачи призов — писем с приглашениями в ближайший доступный кинотеатр. Через неделю после старта сайт пошёл в лайв, билеты пошли в кассы, и в первый же вечер 2 человека стали счастливыми победителями.
Однако прошла неделя и заказчик начал писать тревожные письма — больше никто так и не выиграл! Очередное тестирование и пересмотр кода ничего не дали — всё работало идеально, вводишь хороший код — победил, плохой — повезёт в другой раз. Конечно, вероятность корректного кода маленькая — около 0.0005, и не все люди любят играть в лотерею, но смущало то, что в первый день кто-то всё-таки выиграл.
В итоге кинопрокатчик принял решение — заполнить кинотеатры любой ценой. Мы переписали всю логику для подтасовки результатов… и вот только тут к нам пришло понимание проблемы. Заказчик получил тот же самый список кодов, что и мы, и переслал его в типографию. Естественно, коды были распечатаны на последовательно идущих билетах. Затем, понятное дело, билеты разослали пачками по кинотеатрам, а там раздали пачками по кассам. И вероятнее всего, те самые “первые попавшиеся, неважно какие” 500 кодов, которые мы взяли из 500 первых строк файла, попали все на 1 сеанс кино. Утешает только то, что лишь 2 из 500 зрителей решили проверить свои билеты.
А мораль вся в заголовке — помните о бумажках, на которых напечатают ваши данные, помните об “ограничениях” реального мира.
Автор: danl