Имя: Пароль:
IT
 
Генерация карт лото или три года спустя
0 1Сергей
 
18.07.12
09:59
Продолжение некротемы Генерация карт лото

Задача была "для себя", потому сильно не стал заморачиваться, и бросил. Но, сейчас, спустя три года меня осенило. Я её таки решил. Если кому интересно рассказываю алгоритм.

По условию задачи, имеются 6 карт с таблицами 3*9 клеток. В них записаны номера с 1 по 90, по 15 номеров на каждой карте. В каждой строке каждой карты по 5 номеров (4 пустых клетки). В колонке карты может быть 1 или 2 номера (не ноль и не три)
пример http://savepic.su/2208500.gif

Таким образом, в колонке 1 размещены 9 номеров(1-9),
в колонках 2-8 по 10 номеров,
в колонке 9 - 11 номеров (80-90)
Чтобы 15 номеров (одна карта) распределить на 9 кучек (колонок) по 1 или 2 номера, может получится только 1+1+1+2+2+2+2+2+2. Других вариантов быть не может.

Рассмотрим распределения колонок по 6 картам:
1 колонка, 9 номеров: 1+1+1+2+2+2
2-8 колонки, 10 номеров: 1+1+2+2+2+2
9 колонка, 11 номеров: 1+2+2+2+2+2

Теперь сам алгоритм
1. Распределяем "единицы" (колонки с одним номером) по картам/колонкам
1.1. Случайным образом выбираем одну карту, в которой в последней колонке будет 1 номер.
1.2. В колонках 1-8 случайным образом выбираем две карты, в которых будут "единицы". Следим, чтобы в карточке не получалось больше 3 единиц.
1.3. В одной из карт должно получится всего 2 единицы. Если в первой колонке этой карты уже установлена единица, то следует повторить п.1.2, перезаполнить колонки 1-8. Если же в первой колонке этой карты единицы нет, то устанавливаем туда единицу.
2. Распределяем единицы и двойки по строкам карт. Или, точнее, выбираем клетки, которые будут заполнены.
2.1. Заполняем первые строки карт. Для каждой карты случайным образом выбираем 5 колонок. В первых строках этих карт в выбранных колонках будут номера.
2.2. Заполняем вторые строки карт.
2.2.1. Вибираем колонки с двойками, в которых первые строки пустые. В таких колонках вторые (и третьи) строки будут заполнены.
2.2.2. Случайным образом выбираем ещё колонки для заполнения 2-ой строки (должно быть заполнено 5 клеток). Следим, чтобы количество заполненных клеток по колонке карты не превышало 1 или 2 согласно распределенным единицам и двойкам в п.1.
2.3. Заполняем третьи строки. Выбираем колонки, в которых количество заполненных клеток меньше распределенных нами единиц и двоек (п.1).
3. Распределяем номера по выбранным нами клеткам в п.2.
3.1. Для каждого номера 1-90 определяем номер колонки. Случайным образом выбираем незаполненную клетку (карту/строку), согласно п.2. она должна быть выбранна нами для заполнения.

Реализация на 1С 77: http://zalil.ru/33582480
1 Vladal
 
18.07.12
10:22
Когда-то О-Планет на Инфостарте писал о реализации Спортлото, как-то так у него всё быстро работало на файловой со всеми мильёнами вариантов. Или не так.
2 Vladal
 
18.07.12
10:22
Повесь эту игрушку на Инфостарт.
3 vde69
 
18.07.12
10:25
почему нельзя использовать заранее определенные варианты и генератором выбирать просто порядковый номер?
4 Ненавижу 1С
 
гуру
18.07.12
10:25
(3) ну тогда надо либо все варианты заранее сгенерировать, либо не все варианты будут использованы
5 vde69
 
18.07.12
10:27
(4) в реальном лото ты выбираешь из готовой пачки, там не так много вариантов...
6 Ненавижу 1С
 
гуру
18.07.12
10:27
(5) то реальное
7 vde69
 
18.07.12
10:33
(6) кстати хороший вброс: сколько может быть вариантов?
8 1Сергей
 
18.07.12
10:44
(6) вариантов на самом деле очень много. Некоторые лотереи генерируют билеты по тому же принципу, а билетов у них миллионы
9 Алистар
 
18.07.12
10:45
вчера поиграл в лото в Сбербанке проиграл 30р
10 1Сергей
 
18.07.12
10:49
(1) много встречал реализаций данной задачи, но не одна не выполняла всех правил. Часто каждая карточка заполнялась отдельно, отчего в трёх карточка подряд могли попадаться одинаковые номера. Видел, что в карточках заполнялись сразу три клетки в колонке или даже совсем ни одной
11 1Сергей
 
18.07.12
10:51
Кстати, в воскресенье купил настольную игру Лото. И что же я там увидел? Неправильно заполненные карточки. Собственно, это и побудило меня "взяться за старое"
12 Sensodin
 
18.07.12
11:01
(11) а как вы определили то что они неправильно заполнены?
13 1Сергей
 
18.07.12
11:02
(12) на первой и второй карте (они пронумерованы) были одинаковые числа. В некоторых колонках по 3 числа, в некоторых ни одного