Имя: Пароль:
IT
 
Генерация карт лото
0 1Сергей
 
17.07.09
13:45
Не могу никак придумать алгоритм заполнения карт Лото(русское классическое)

Карта состоит из таблицы, 9х3 поля. Используемые номера от 1 до 90.
В каждой колонке карты может быть 1 или 2 числа (не 0 и не 3). В каждой строке 5 заполненных клеток. Таким образом, в карте 27 полей, 15 из которых заполнены.
Каждая партия состоит из 6 карт. Т.е. все 90 чисел распределяются по 6 картам.
Еще небольшой ньюанс. В первой колонке используется числа от 1 до 9 (9 штук); в колонках со 2-ой по 8-ую числа одного десятка (от 10 до 19, 10 штук); и в последней 9-ой колонке числа от 80 до 90 (11 штук).
Вот пример:
http://www.digiseller.ru/preview/p1_70922090724570.jpg

Пытаюсь заполнить случайным образом, соблюдая все правила. Но всегда для последних 1-3 чисел не находится места. Т.е. существуют полностью не заполненые карты, но вставить туда число не получается, постоянно нарушается одно из перечисленных мною правил.
1 NikVars
 
17.07.09
15:16
2 1Сергей
 
17.07.09
15:38
(1) Не нашел то, что нужно. Есть программы, которые генерируют. Но ни одна не соблюдает правила генерации
3 Salimbek
 
17.07.09
15:42
Тебе одну карточку или целиком партию?
4 1Сергей
 
17.07.09
15:44
(3) Мне бы алгоритм. Чтоб можно было генерировать их сколько угодно
5 GenV
 
17.07.09
15:45
(2) А почему не получается вставить число? Вроде алгоритм простой - раскидываешь каждый десяток по колонке, в колонке по одной из 3-х групп каждой из 3-х карт (если проверяемая карта уже заполнена, тогда в оставщихся двух, если опять заполнена - в оставшейся одной).
6 GenV
 
17.07.09
15:46
5+ т.е. 6-ти карт.
7 1Сергей
 
17.07.09
16:09
(5,6) Оно как-то в теории всё просто получается. А на практике труба.
Делал и как Вы предлагаете. Не получается.

Вот наброска на 1Св7:
http://slil.ru/27842192
8 NikVars
 
17.07.09
16:14
(0) Я не вдавался в детали - лень думать.
А если тебе все эти числа просто рассыпать по карточке. Далее случайно вставлять не заполненные (числа затирать, они попадают в общую кучу, откуда ты их будешь брать для новой карточки) и так далее, рассыпал остаток чисел, рассыпал пустышки, получил уменьшенный массив, и далее и далее.
9 Salimbek
 
17.07.09
16:18
(7) Смотреть лень. Я бы случайно заполнял первые 4 колонки (по 1-2 числа в карточке), а оставшиеся - полным перебором с учетом указанных алгоритмов.
10 1Сергей
 
17.07.09
16:36
Ура! Получилось. Всем огромное спасибо за подсказки!

Дело было вот в чем. Как я уже говорил числа распределяются так:
1 колонка - 9 чисел
2 колонка - 10 чисел
3 колонка - 10 чисел
4 колонка - 10 чисел
5 колонка - 10 чисел
6 колонка - 10 чисел
7 колонка - 10 чисел
8 колонка - 10 чисел
9 колонка - 11 чисел
Т.е. последняя колонка самая сложная для распределения чисел, а первая самая простая.
В моем алгоритме я сначала заполнял первую колонку во всех картах, затем вторую, и так далее. И в конце заполнял самую сложную, девятую колонку.

Теперь же я заполняю с конца. Сперва самую сложную девятую, потом восьмую, ... и в конце самую простую первую. И оно заработало!
11 NikVars
 
17.07.09
16:44
(10) Ну ты крут!!!! Именно КиндерВУД!!!
12 Torquader
 
17.07.09
17:29
Так мне кажется, что проще задачу свести к более простой - сначала выбрать по одному числу из каждой колонки, чтобы выбирать потом не 1-3, а 0-2.
Далее, неиспользованные числа смело складываем в массив - тусуем его и выдёргиваем ещё 6 чисел (девять мы распределили по колонкам).
13 Ковычки
 
17.07.09
17:30
все сюда
http:/6x45ru
14 Ковычки
 
17.07.09
17:30
)))
15 Torquader
 
17.07.09
17:31
Если какая-то колонка заполнилась, то просто выкидываем из массива все остальные числа этой колонки.
Также можно, сначала случайно выбирать пополняемую колонку, а потом число в ней.
16 Torquader
 
17.07.09
18:27
В общем так:
Сначала 6 любых цифр из каждой колонки распределяем по 6 картам - чтобы в каждой колонке на каждой карте была хотя бы одна цифра.
Потом, оставшиеся цифры собираем в кучу и случайно распределяем на шесть частей по шесть в каждой - каждая часть ляжет на свою карту.
Просто и быстро.
17 у лю 427
 
17.07.09
19:52
на самом деле по советам из топика не получится...
18 NikVars
 
17.07.09
21:05
(17) Этот пост, похоже, тоже совет...
19 Torquader
 
17.07.09
21:31
(17) и чего у нас не получится ?
20 1Сергей
 
18.07.09
13:23
Мой алгоритм срабатывает удачно лиш примерно 1 из 10 раз...
Сейчас стал подумывать о рекурсии. Как думаете?
21 Torquader
 
18.07.09
15:12
Тогда проще делать так:
Случайным образом массив из 90 чисел делишь на 6 частей.
После этого выполняешь проверку - может ли каждая часть лежать на карте - если нет, то делаешь следующую выборку.

На самом деле проблема в том, что мы распределяем "дырки", то есть в первой колонке 9 цифр - мы их кладём на 6 карт, и на трёх картах будут "дырки" (по одной цифре), а остальные будут по две.
Если 10 цифр - то у нас распределяется две "дырки".
Если 11 цифр - то одна.
На карте 27 полей, и 15 заполненных - поэтому, на карту должны попасть 12 дырок.
(при этом выкидываем обязательные по условиям по одной "дырке" в ряду).
Итого получаем 3 дырки.
Есть мнение, что сначала нужно распределить эти "дырки" по картам, а уже потом полученные места заполнять числами (выбирая их из колонок).
В этом случае ни одного костыля не должно встретится.

Вопрос в другом - как доказать, что такое распределение действительно равноправное.
22 mishaPH
 
18.07.09
18:09
(0) интернет казино? простите интернет лото?
23 Композитор
 
18.07.09
19:18
(0) 1C:Русское лото? На платформе 8.1?
24 Композитор
 
18.07.09
19:32
+(23) вполне осуществимо, кстати...
25 Torquader
 
19.07.09
21:48
Генерация карт лото:
Каждая крт лото состоит из трёх строк по девять столбцов в каждой.
При заполнении числами мы должны на шесть карт разместить числа от 1 до 90,
так чтобы у нас в каждом столбце на каждой карте было одно или два числа.
Всего на каждой карте долж.но быть по 15 чисел.
Два ряда из 9 это 18 чисел, то есть на каждой карте должно появиться
три "дыры" - поэтому сначала мы разместим по картам "дыры", а уже потом
будем размещать числа.
1) размещение "дыр".
====================
У нас 9 блоков, в которых содержатся дыры:
в первом блоке 3 "дыры", в остальных семи - по две, а в последнем - одна.
Для размещения дыр мы будем использоватль следующий алгоритм:
1) Случайным образом выбираем блок с дырами для размещения.
2) Выбираем из массива карт все карты с наименьшим заполнением.
3) Выкидываем из этого объединения карты, содержащие дыры из указанного блока.
4) Случайным образом выбираем карту и проставляем в неё дыру.
5) Если в блоке ещё остались дыры, то повторяем с пункта 2.
6) Еслив системе ещё остались наборы дыр, то повторяем с пункта 1.
7) Алгоритм размещения дыр выполнен успешно.
Теперь некоторые пояснения:
Мы выбираем наименее заполненные карты, чтобы гарантировать себе, что у нас
не случиться ситуации, когда нам придётся размещать две одинаковые дыры
на одну карту, так как остальные уже заполнены.
Также, чтобы избежать именно этой ситуаии, мы размещаем всю группу дыр сразу.
В этом случае у нас равнозаполненные блоки и гарантировано нет карт,
на которые необходимо положить сразу две дыры.
2) Размещение чисел:
====================
1) Формируем шаблоны карт для каждого столбца с учётом размещённых дыр.
2) Последовательно выбиремстолбцы чисел.
3) Для каждого столбца случайным образом выбираем из него числа.
4) Полученную случайную последовательность размещаем по шаблону.
Здесь нет никаких трудностей, так как дыры мы уже разместили, и все числа
имеют свои места, распределённые по картам.
3) Формирование селета карт:
============================
Теперь нам нужно разместить числа на карте так, чтобы получилось 5 рядов
по 5 чисел в каждом. Здесь вообще ничего сложного нет.
1) Для первого ряда случайным образом выбираем 5 столбцов из 9.
2) Для второго ряда остаются столбцы, в которых может быть два числа.
3) Выбираем из них опять по 5 столбцов - получаем второй ряд.
4) В третий ряд остаются невыбранные в первых двух рядах числа.