Программирование и лотереи: часть 1
В этой части автор рассказывает причинах написания данного цикла и генерирует первую самую простую статистику одной лотереи – по убыванию числа выпадений номеров.
Введение
Мне всегда интересна была тема лотерей. Нет, не в связи с азартом (я не «игровой» как говорят у нас на местном сленге), а в связи с программированием. Я не отношусь к тем людям, кто хочет нащупать так называемую «систему выигрыша» (спойлер – её нет), но хочу выявить некие закономерности (спойлер – они есть).
Этот цикл небольших моих статей будет интересен определённой части программистов, кто интересуется данной областью. Определенной структуры цикла у меня пока нет, всё пишется и публикуется так сказать «с колес». Язык программирования преимущественно PHP, код с пояснениями, поймет даже начинающий веб разработчик.
Первое исследование
Перейдем к практике. Так как нам по большому счету безразлично что исследовать, то берем первую попавшуюся лотерею - «Пять-О-Пять» от Национальной Лотереи.
Примечание. Все упоминающиеся в этой и последующих статьях лотереи и организаторы не заплатили мне ничего, я не призываю играть и не рекламирую азартный бизнес. Изображения, скриншоты и торговые марки принадлежат правообладателям, используются исключительно в демонстрационных целях. Моральная сторона дела мне не очень интересна, я исследую только техническую. Так что претензии не принимаются (улыбающийся смайлик).
Итак, в лотерейном билете «Пять-О-Пять» два игровых поля. Заполните первое поле, выбрав пять неповторяющихся чисел от 1 до 50 включительно и два числа от 1 до 12 включительно во втором поле.
Национальная лотерея предоставляет публичное апи для показа результатов прошлых игр. Это очень удобно не надо парсить сайт. Скачиваем файлик json для всех прошлых розыгрышей пять-опять. Их немного, меньше 6 тысяч.
Структура json довольно проста

Код ниже читает этот скачанный ранее json (напрямую с сервера сайт не отдаёт, надо имитировать браузер – этим мы займемся в следующих материалах), декодирует, обрабатывает все розыгрыши, подсчитывает число выпадений и получившийся массив (ключ – номер, значение – число выпадений) сортирует по убыванию. Информация выводится в виде таблицы.
<?php // Читаем содержимое файла $jsonContent = file_get_contents('json.txt'); if ($jsonContent === false) { die('Не удалось прочитать файл json.txt'); } // Декодируем JSON $data = json_decode($jsonContent, true); if ($data === null) { die('Ошибка при парсинге JSON'); } // Массивы для подсчета main и sub номеров $mainCounts = []; $subCounts = []; // Обрабатываем каждый розыгрыш foreach ($data['content'] as $draw) { // Подсчет main-номеров if (isset($draw['combination']['main'])) { foreach ($draw['combination']['main'] as $number) { $mainCounts[$number] = ($mainCounts[$number] ?? 0) + 1; } } // Подсчет sub-номеров if (isset($draw['combination']['sub'])) { foreach ($draw['combination']['sub'] as $number) { $subCounts[$number] = ($subCounts[$number] ?? 0) + 1; } } } // Сортировка по убыванию arsort($mainCounts); arsort($subCounts); ?> <html> <head> <title>loto upread.ru</title> <link rel="stylesheet" type="text/css" href="bootstrap.css" > </head> <body> <div id="wrapper"> <div> <h2>Основные номера (main)</h2> <table class="table table-striped"> <tr> <th>Номер</th> <th>Выпадений</th> </tr> <?php foreach ($mainCounts as $number => $count) { echo "<tr><td>$number</td><td>$count</td></tr>"; } ?> </table> </div> <div> <h2>Дополнительные номера (sub)</h2> <table class="table table-striped"> <tr> <th>Номер</th> <th>Выпадений</th> </tr> <?php foreach ($subCounts as $number => $count) { echo "<tr><td>$number</td><td>$count</td></tr>"; } ?> </table> </div> </div> </body> <style> #wrapper{ display: flex; margin: auto; justify-content: space-around; } </style> </html>И в итоге получается у нас что-то типа такого

Для красоты я добавил бутстрап для оформления.

Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Обсудить или задать вопрос по этой или любой другой теме можно на нашем форуме