Методы вычисления точных вероятностей в покере. Проектирование алгоритма нахождения вероятности выигрыша для нескольких игроков. Теоретический расчет вероятности выигрыша в игре. Программная оптимизация и упрощение алгоритмов вычисления вероятностей.
Техасский холдэм - пример покерной игры с общими картами, в которой существуют карты, которые используются всеми игроками при составлении комбинаций. Особенно интенсивно сейчас развивается покер в сети: существует огромное количество покер-румов, где есть возможность сыграть партию в покер с любым человеком из любой точки мира.Оценкой вероятности события может служить частота его наступления в длительной серии независимых повторений случайного эксперимента. Лапласа мерой вероятности называется дробь, числитель которой есть число всех благоприятных случаев, а знаменатель - число всех возможных случаев. Случайная величина - это величина, которая принимает в результате опыта одно из множества значений, причем появление того или иного значения этой величины представляет собой случайное событие.Вычисление точных вероятностей в покере для каждой игры, которую вы играете, может оказаться сложной математической операцией, а времени для вычислений при игре в сети не так уж много, особенно, если вы играете сразу на нескольких столах. Например, если у вас есть 15 аутов, вероятность на терне будет рассчитываться как Р(терн) = 15 / 47 (47 = 52 карты в колоде - 2 карманные карты - 3 карты флопа) и составит ~ 32%. Если на терне придет карта, которая не улучшит вашу руку и не поможет сопернику, то вероятность на ривере будет 15/46 - около 33%. Подсчет вероятности того, что ваша карта придет на терне или ривере несколько сложнее, чем простое суммирование вероятностей, поскольку эти события не являются независимыми, например если туз пик придет на терне, то уж на ривере вы его точно не дождетесь. Существует три возможных варианта, что вы получите один из необходимых вам аутов: он придет на терне, на ривере, или обе карты после флопа улучшат вашу руку.Необходимо спроектировать алгоритм нахождения вероятности выигрыша для нескольких игроков в том случае, если известно, какие карты вышли, какие на столе и какие карты у каждого из игроков. Эту основную задачу можно разбить на несколько подзадач: Представление карт Необходимо создать удобный формат для того чтобы хранить информацию о картах (номер и масть).Я решил использовать 16-битные переменные: Первые двенадцать битов отвечают за наминал карты, последние четыре за масть (cdhs AKQJT9876543) Если все первые двенадцать битов имеют значение «0», то это двойка. Перебирать все возможные комбинации карт я буду пятью вложенными друг в друга циклами (так как всего пять карт на доске). Причем, у каждого вышестоящего цикла, число итераций будет на единицу меньше предыдущего, это связано с тем, что с каждой картой, появившейся на доске, число возможных выпавших карт будет уменьшаться на один. Для того чтобы определить победителя я решил использовать приоритеты для каждой комбинации (от роял флеша до обычного кикера). Каждой покерной комбинации будет соответствовать некоторое число, причем будет учитываться и наминал карты, будь это второй кикер для сета или первая карта у комбинации стритфлеш.// перебираем все возможные варианты доски, 5 карт for(a=0;a<48;a ) {hand[0] = deck[a]; switch (NBROFRANKS[ranks = c | d | h | s]) {case 2: /* каре или фул хаус */ i = c & d; /* любые две другие карты*/ if (!(i & h & s)) {/* нету общего бита для всех карт*/ i = c ^ d ^ h ^ s; /* сет */ return Value(FULL_HOUSE) | HIBOTRANK[i] with(i ^ ranks); } else return Value(FOUR_OF_A_KIND) | HIBOTRANK[i] with(i ^ ranks); case 3: /* сет и два кикера или две пары и кикер */ if ((i = c ^ d ^ h ^ s) == ranks) { /* сет и два кикера */ if ((i = c & d)!= 0) return Value(THREE_OF_A_KIND) | HIBOTRANK[i] with(i ^ ranks); case 4: /* пара и три кикера */ i = c ^ d ^ h ^ s; /* биты кикеров */ return Value(PAIR) | HIBOTRANK[ranks ^ i] | i;Моя программа выдавала такие же результаты с погрешность в сотые доли процента. Примеры: Моя программа при руке Qs Js против руки оппонента Ts Th выдает шансы на победу 46.663618% и 47.114706% на победу или ничью. Если известна только собственная рука Ts 9S и неизвестном флопе моя программа выдает 52.376873% на победу, на ничью и победу 55.671884%, в то время как на сайте шансы на победу 52.33% а на ничью 3.31%.В процессе написания моей курсовой работы я ознакомился с различными алгоритмами подсчета вероятности в покере, а также с их достоинствами и недостатками. Во время кодирования я столкнулся с различными проблемами, самой сложной из них оказалось проблема определения победителя по его комбинации. Так же была проблема с представлением карт, в ходе изучения материалов на эту тему я принял решение об использовании именно такой системе представления карт.
План
Содержание
Определения
Введение
1. Краткие сведения из теории вероятности
2. Обзор имеющихся разработок и алгоритмов
2.1 Метод 1
2.2 Метод 2
2.3 Метод 3
2.4 Метод 4
3. Проектирование алгоритма
3.1 Задачи
3.2 Решения
4. Код
5. Тесты
Заключение
Список использованных источников
Введение
Техасский холдэм (иногда просто называемый холдэм) - самая популярная на сегодня разновидность покера. Популярность, возможно, связана с тем фактом, что основные турниры по покеру проводятся именно в этой разновидности игры. Техасский холдэм - пример покерной игры с общими картами, в которой существуют карты, которые используются всеми игроками при составлении комбинаций.
Особенно интенсивно сейчас развивается покер в сети: существует огромное количество покер-румов, где есть возможность сыграть партию в покер с любым человеком из любой точки мира.
Для успешной игры часто используются различные программы-помощники. Однако, на данный момент это программа либо платная, либо оснащена не всеми необходимыми функциями. Именно поэтому, тема моего курсового проекта является актуальной на данный момент.
Вывод
В процессе написания моей курсовой работы я ознакомился с различными алгоритмами подсчета вероятности в покере, а также с их достоинствами и недостатками. Во время кодирования я столкнулся с различными проблемами, самой сложной из них оказалось проблема определения победителя по его комбинации. Но благодаря советам из интернета решение было найдено. Так же была проблема с представлением карт, в ходе изучения материалов на эту тему я принял решение об использовании именно такой системе представления карт. Еще одной проблемой является длительное время расчета вероятностей при большом количестве игроков, если их руки не известны. В дальнейшем планируется оптимизировать этот алгоритм для сокращения времени расчетов.
По итогам проведенных мной тестов программа показывает очень хорошую точность вычислений, что на данном этапе является одним из самых важных критериев.
Сейчас программа запускается только изпод консоли, визуализация планируется в ближайшем будущем. В перспективе моей курсовой работы реализовать многопользовательскую сетевую игру с возможностью вывода информации о вероятности выигрыша с той или иной комбинацией на руках.