LINUX.ORG.RU

Покер, алгоритмы, С++


0

1

Всем привет!

Для себя пишу всякую всячину, связанную с покером, недавно написал под заказ сервер для флеш клиента на РНР, теперь охота глубже понять игру, собрать кое-какую статистику, и т.п. Заразился идеей вообщем.

Сейчас хочу устроить перебор покерных комбинаций с целью собрать по ним всякую интересную статистику. Всего пятикарточных комбинаций 2598960 - вроде как не очень много, но для РНР перебор. Поэтому как инструмент для решения задачи решил взять С++. Осложняется все тем, что раньше на C++ не писал ни разу, и хоть синтаксис языка мне довольно понятен, все же возникают и трудности.

Тему открываю, чтобы консультироваться с пользователями ЛОРа в вотпросах синтаксиса языка и алгоритмов. Если не лень расшевелить мозг, то вам сюда :)

Так вот, первый вопрос касается алгоритмизации. Как по вашему лучше устроить перебор всех пятикарточных комбинаций ? У меня была мысль завернуть это дело в 5 циклов, но тогда встает проблема дубликатов комбинаций, тоесть получается, что учитывается порядок карт. Как от этого можно избавится ?



Последнее исправление: Xazzzi (всего исправлений: 1)

>Как от этого можно избавится ?

Можно не избавляться, а рассмотреть 52!/47! вариантов, что будет дольше в кол-во перестановок 5 карт: 5!=120 раз.

Или как вариант, перенумеровать все карты и генерировать только упорядоченные комбинации.

aedeph
()

>Сейчас хочу устроить перебор покерных комбинаций с целью собрать по ним всякую интересную статистику.

Для этого, кстати, перебор не нужен. Достаточно бумаги и ручки.

aedeph
()
Ответ на: комментарий от aedeph

Я решил, что делать в 120 раз больше рассчетов - неэфективно, поэтому пошел вторым путем. В итоге получился пятиэтажный цыкл. Но отрабатывает за доли секунды.

Сдедующий интересный вопрос, и собственно промежуточная цель эксперимента - определение силы комбинации. На РНР я нашел реализацию в виде довольно таки монструозной конструкции из switch-ей, занимающей почти полмегабайта. Для одиночных комбинаций она себя оправдывает, но для 2598960 - нет.

Теперь буду искать и придумывать алгоритмы для оценки силы комбинации. Для начала упрощу себе задачу, и не буду учитывать кикеры, ограничиваясь просто типом комбинации (топ-карта, пара, две пары, сет, стрит, флеш,фул хаус, карэ, стрит-флеш). Всего 9 вариантов результата.

Сразу приходит на ум посчитать промежуточные значения - количества карт одной масти, одного достоинства. Дальше - делать выводы на основании этих значений.

Может знаете алгоритм лучше или есть какие-то соображения по этому поводу - пишите :)

Xazzzi
() автор топика
Ответ на: комментарий от aedeph

Перебор нужен не с целью узнать, сколько всего есть вариантов комбинаций. Это первый шаг, статистику я хочу собрать по силе разных комбинаций. Также мне интересено соотношение сила/частота, и количество комбинаций с абсолютно равной силой (по всем кикерам).

Xazzzi
() автор топика
Ответ на: комментарий от Xazzzi

>я хочу собрать по силе разных комбинаций

Так вот это как раз и рассчитывается/прикидывается на бумаге, причём таблицы общеизвестны, например в книге у Брансона.

Ну и собственно до сих пор не был оглашен вид покера. Семикарточный техасский холдем?

aedeph
()

Почитай любой учебник по дискретной математике. Узнаешь много нового. В том числе, как генерировать комбинации.

baverman ★★★
()
Ответ на: комментарий от aedeph

Да, именно холдем, именно семикарточный. То что существуют уже таблицы - знаю, но как я уже говорил - хочу сам вникнуть в игру, понять как тот же Брансон к ним пришел. Он скорее всего считал на бумаге, я выбираю перебор :)

По поводу учебников, признаюсь, читать не люблю. Интереснее на практике эксперементировать, и обращаться к учебнику в случае необходимости.

Xazzzi
() автор топика
Ответ на: комментарий от Xazzzi

А вот и по синтаксису вопрос, в С++ есть оператор взятия по модулю (%), который возвращает остаток от деления. А опрератор который возвращает от деления только целую часть есть ? Если есть, подскажите дураку )

Xazzzi
() автор топика
Ответ на: комментарий от Xazzzi

По поводу учебников, признаюсь, читать не люблю.

Без минимальной CS базы ты обречен на вечные велосипеды и пробуксовку на ровном месте.

baverman ★★★
()
Ответ на: комментарий от phoenix

Хм, а я думал он возвращает float. Спасибо.

Минимальная база есть, мне пока хватит. Не хватит - пойду улучшать свои знания, библиотека недалеко.

Xazzzi
() автор топика
Ответ на: комментарий от Xazzzi

зависит от типа аргументов. Для двух целых будет целое

phoenix ★★★★
()
Ответ на: комментарий от yoghurt

Спасибо за ссылку! Разобраться не вышло, ибо там сразу несколько вариантов покера, а мне достаточно холдема...

Xazzzi
() автор топика
Ответ на: комментарий от Xazzzi

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

Вопрос такой: как оформить все это дело? Сможет ли си обработать массив размерностью до 2 млн. элементов? Как сохранить все это дело в файл, или же нет особенного смысла, если время выполнения программы меньше 8 секунд?

Xazzzi
() автор топика

Намного полезнее будет сначала книжку почитать, а потом уже вопросы задавть. В твоем случае выбор широк. Ты ничего не понимаешь ни в С++, ни в алгоритмах, ни в покере.

anonymous
()
Ответ на: комментарий от anonymous

Крутой кодер отозвался :) В C++ я и правда не знаток, а вот с чего автор высосал остальные выводы - боюсь даже передположить.

Xazzzi
() автор топика
Ответ на: комментарий от annulen

:) Тема мне интересна просто... Сейчас получилось отсортировать сгенерированный масив данных qsort-ом, на диск решил не сохранять - генерация идет от силы секунд 10 при включении проги. Приделал небольшой, но гордый интерфейс - руский вывод в консоли, цветные надписи для упрощения понимания, браузер сгенерированного масива, можно посмотреть что творится внутри... На очереди - сбор статистики по частоте появления, средних абсолютных силах комбинаций.

Xazzzi
() автор топика
Ответ на: комментарий от anonymous

> Ты ничего не понимаешь ни в С++, ни в алгоритмах, ни в покере.

Опередили...

AlexVR ★★★★★
()
Ответ на: комментарий от Xazzzi

Ну дык аноним дело говорит, ты реально чистый ноль и в алгоритмах, и в покере.

Прочти хотя бы начало _любой_ хорошей книги по покеру, там будет нормально описана математическое обоснование и сил рук, и частот.

aedeph
()
Ответ на: комментарий от Xazzzi

> Хм, а я думал он возвращает float. Спасибо.

Если делишь int на int, то получишь int. В противном случае можешь воспользоваться приведением типов: b=(int)(a/c)

drull ★☆☆☆
()
Ответ на: комментарий от drull

Это я уже понял :) Собственно сейчас дописал программу, возвращает более менее подробную статистику для любой введенной руки... В планах - дописать к ней функционал оценки вероятностей... Но поскольку собеседники дружно решили, что я полный 0, то спрашивать у «ненулей» больше пока не буду, а буду решать задачку своими силами. Кому интересно, что получилось - могу скинуть результат на почту. Спасибо за внимание к теме, помощь и адекватные оценки.

Xazzzi
() автор топика
Ответ на: комментарий от Xazzzi

> В планах - дописать к ней функционал оценки вероятностей...

В pokerth уже все давно посчитали. См. их исходники. Или тебе интересно сделать это самому?

drull ★☆☆☆
()
Ответ на: комментарий от drull

Да, хочу сделать сам. Исходники pokerth посмотрел, они мне больше интересны в плане игрового интелекта, который там используется (играет кстати не очень хорошо, 1 на 1 проиграл 5000 фишек за 29 раздач). Код оценки руки там тоже достаточно громоздкий, хотя может он и получше моего (оценивает руки не из 5 карт ?). Сложно сказать... У меня функция оценки силы комбинации занимает 138 строк, в pokerth кажется побольше явно... Оценку вероятностей в pokerth пока не понял, но постараюсь разобраться. В любом случае для себя буду писать не оглядываясь на нее, хотя может быть по тому же принцыпу.

Xazzzi
() автор топика
Ответ на: комментарий от Xazzzi

> Оценку вероятностей в pokerth пока не понял, но постараюсь разобраться

ЕМНИП вероятности там рассчитаны заранее.

drull ★☆☆☆
()
Ответ на: комментарий от drull

М.б. Как я понял за оценку карт отвечает engine/localengine/cardsvalue.cpp . Там довольно много всего, а особого желания разбирать код нет.

Xazzzi
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.