Выберите случайные комбинации элементов списка так, чтобы ни один элемент списка не присутствовал в нескольких выборках (SQL) - PullRequest
0 голосов
/ 25 октября 2011

У меня немного не хватает идей, как реализовать небольшой проект.

Что у меня есть:
- список пользователей, включая их ID и имя

Чего я хочу достичь:
- я хочу объединить каждого пользователя в этом списке с другим пользователем, чтобы ни один пользователь не был назначен более чем одному пользователю и ни один пользователь не был назначен для себя,- Комбинация должна быть случайной и должна учитывать прошлые комбинации

Моя идея пока:
- У меня есть эта информация:

Пользователь (A, B, C, D) (фактическое число пользователей колеблется от 50 до 400)
Возможные комбинации: (AB, AC, AD, BC, BD, CD)
Произвольная ничья (1): (AB,CD)
Случайная ничья (2): (AD, BC)
Случайная ничья (3): (AC, BD)

  • Мне удалось получить все возможные комбинации, используя соединениепользовательской таблицы с собой.
  • Полагаю, я могу учесть предыдущие ничьи, сохранив ничьи в отдельной таблице и ограничив возможные комбинации теми, которых нет в этой специальной таблице.

Что я могу'do do:
- я не знаю, как выбрать случайным образом из списка возможных комбинаций, чтобы каждый пользователь участвовал только в одной комбинации на один розыгрыш (например, AB, AD в одном розыгрыше не допускается)
- Я пытаюсь использовать sql или немного php для этого (возможно, javascript)

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2012

Решением является проблема "Таблица Бергр", см. Википедия: http://en.wikipedia.org/wiki/Round-robin_tournament.

Последнее (лучшее) решение принадлежит профессору Фрончека (Далибор Фрончек, профессор Университета Миннесоты в США).

Для пользовательских решений посмотрите таблицу решений n ^ 2.

0 голосов
/ 25 октября 2011

Простое решение:

Создайте временную таблицу со строкой для каждой пары. Цикл по списку пользователей, пропускающий случайное количество пустых строк от 1 до количества пустых строк - вставьте пользователя.

Простое решение № 2:

Дано N пользователей. Назначьте каждому пользователю уникальное случайное число от 1 до N (удалите случайным образом из набора всех чисел от 1 до N). Соедините каждого пользователя с 1-N / 2 с пользователем от N / 2 + 1 до N.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...