Пятикарточный покер. Вероятности выпадения комбинаций

 

Министерство образования Республики Беларусь

Белорусский национальный технический университет

Энергетический факультет

Кафедра «Тепловые электрические станции»










Курсовая работа

по дисциплине

«Информатика и интегрированные прикладные системы»

Пятикарточный покер. Вероятности выпадения комбинаций





Исполнитель: Адуло Александр Сергеевич

Гр. 106811

Руководитель: Пронкевич Сергей Александрович






Минск 2012

Содержание


Введение

Постановка задачи

Математика образования комбинаций в покере

Текст программы

Результат выполнения программы при различных вариантах входных файлов

Вывод

Список литературы

Введение


C++ - компилируемый статически типизированный язык программирования общего назначения.

Поддерживает разные парадигмы программирования, сочетает свойства как высокоуровневых, так и низкоуровневых языков. В сравнении с его предшественником - языком C, - наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования. Название «C++» происходит от названия языка C, в котором унарный оператор ++ обозначает инкремент переменной.

Являясь одним из самых популярных языков программирования, C++ широко используется для разработки программного обеспечения. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений (например, видеоигры). Существует несколько реализаций языка C++ - как бесплатных, так и коммерческих. Наиболее популярны проект GNU, Microsoft, Intel и Embarcadero (Borland). C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#.

В 1998 году был ратифицирован международный стандарт языка C++: ISO/IEC 14882:1998 «Standard for the C++ Programming Language»; после принятия технических исправлений к стандарту в 2003 году - нынешняя версия этого стандарта - ISO/IEC 14882:2003.

В 1983 году в C++ были добавлены новые возможности, такие как виртуальные функции, перегрузка функций и операторов, ссылки, константы, пользовательский контроль над управлением свободной памятью, улучшенная проверка типов и новый стиль комментариев (//). Его первый коммерческий выпуск состоялся в октябре 1985 года. В 1985 году вышло также первое издание «Языка программирования C++», обеспечивающее первое описание этого языка, что было чрезвычайно важно из-за отсутствия официального стандарта. В 1989 году состоялся выход C++ версии 2.0. Его новые возможности включали множественное наследование, абстрактные классы, статические функции-члены, функции-константы и защищённые члены.

В 1990 году вышло «Комментированное справочное руководство по C++», положенное впоследствии в основу стандарта. Последние обновления включали шаблоны, исключения, пространства имён, новые способы приведения типов и булевский тип.

Стандартная библиотека C++ также развивалась вместе с ним. Первым добавлением к стандартной библиотеке C++ стали потоки ввода/вывода, обеспечивающие средства для замены традиционных функций C printf и scanf. Позднее самым значительным развитием стандартной библиотеки стало включение в неё Стандартной библиотеки шаблонов.

Никто не обладает правами на язык C++, он является свободным. Однако сам документ стандарта языка (за исключением черновиков) не доступен бесплатно.

Постановка задачи


Задачей курсовой работы является написание программы: «пятикарточный дро покер» в которой будут показаны карты выпавшие игроку на руки и выводить название комбинации карт оказавшихся у него, так же следует рассчитать вероятность выпадения данных комбинаций.


Математика образования комбинаций в покере


О какой бы разновидности покера не шла бы речь, существуют строго определенные названия покерных комбинаций. Их всего девять, но на их основе возникают все новые и новые покерные игры.



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

Для того чтобы уметь оценивать вероятности в покерных задачах необходимо знание азов комбинаторики и теории вероятности. А пока, я предлагаю обойтись без них и посчитать, сколько всего есть комбинаций Роял-Флеша (пять карт одной масти от Десятки до Туза). Надеюсь, никто не будет спорить с тем, что их в природе всего четыре вариации, по одной каждой масти.

Также «на пальцах», без формул, можно подсчитать количество комбинаций Каре (четыре карты одного достоинства)

В колоде существует 13 рангов карт - от Двойки до Туза. Соответственно, Каре может иметь 113 достоинств. Комбинация содержит пять карт. Значит, в каждом из 13-ти Каре разных рангов пятая карта может быть любой из оставшихся карт в колоде. Число карт в колоде - 52, четыре уже используем. Остается 48 свободных карт, которые мы по одной можем добавлять к четырем картам одного и ранга для получения каждый раз новой комбинации Каре. Умножив 13 на 48, получим 624- количество возможных карточных комбинаций Каре.

Самый младший Флеш-Стрит заканчивается Пятеркой. Самый старший - Королем. Итого: число комбинаций Флеш-Стрит одной определенной масти есть 8. Восемь умножаем на четыре масти и имеем 36 - количество комбинаций Флеш-Стрит.

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

Формула первая Количество перестановок из числа n равна n! (n факториал).

= n!


Напомню, что факториал это действие, при котором подвергаемое этому действию число n нужно умножить на (n-1), потом умножить на(n-2) и так далее до единицы.

Пример 3! = 3*2*1 = 6 Практическое применение: Трех разных по росту людей можно построить в ряд шестью способами. Или: Комплексный обед из трех блюд можно съесть шестью разными способами, меняя очередность.

Формула вторая и последняя. Количество сочетаний из числа n по m. Записывать можно так Cn



Эта формула не только идеально подходит для вычисления числа комбинаций в покере, но и полезна для решения других практических задач. Стоит только понять, как и при каких условиях ее применять.

Следующая после Каре (по простоте подсчета количества) это комбинация Флеш. Нахождение количества комбинаций Флеш будет хорошим примером применения формулы числа сочетаний из n по m. Требуется вычислить - сколько разных 5-ти карточных комбинаций Флеш можно составить из 13 карт одной масти? Применим формулу количества сочетаний. Числом n здесь будет 13 - число карт одной масти, а числом m будет 5 - необходимо карт для составления Флеша.

= C135 = 13!/5!*(13-5)! = 1287


пятикарточных комбинаций отдельной масти. Умножая на четыре, по количеству мастей, поучаем 5148. Теперь, вычитая из этого числа 4 Роял-Флеша и 36 Флеш-Стритов, получим верную цифру 5108 - это количество разных флешевых пятикарточных комбинаций.

Итого имеем:

Роял-Флеш 4

Флеш-Стрит 36

Каре 624

Фул-Хаус ?

Флеш 5108

Пропустили Фул-Хаус, считаем. Эта покерная комбинация состоит из трех карт одного ранга и двух карт другого ранга. Возьмем в руку четыре карты одного достоинства. Отбрасывая одну карту можно получить три карты одного ранга четырьмя способами.

Проверяем, используя всё ту же формулу Cn

43=4!/3!*(4-3)!=4


А получить из четырех карт одного ранга две парные карты можно шестью способами:

42=4!/2!*(4-2)!=6 число вариантов парных карт одного ранга


Рассматривая частный пример, возьмем в руки три Туза. Чтобы получить Фул-Хаус, необходимо добавить к этим картам любую пару. Всего пар в колоде 6*12 (12 это количество свободных рангов от 2 до Короля). 6 - это число вариантов парных карт одного ранга. Итого: 4*6*12=288 всевозможных Фул-Хаусов включающих три Туза. Где 4-это число способов получить три карты одного ранга. Умножая это количество на количество рангов 13, получим 3744 - число Фул-Хаусов в покерной колоде.


*13=3744


Чтобы двигаться от простого к сложному, рассмотрим комбинацию Флеш-Стрит от 2 до 6. Теперь, поменяем Двойку на Двойку другой масти, создавая из Флеш-Стрита простой Стрит. Чтобы получать все новые и новые Стриты нам достаточно лишь менять масти стритообразующих карт, оставляя их ранг неизменным. В данном случае мы можем последовательно изменять масти у пяти карт - Двойки, Тройки, Четверки, Пятерки и Шестерки:

Поменяли масть одной из этих карт - получили Новый Стрит.

Прибегнув к такому перебору можно точно подсчитать количество Стритов, начинающихся с Двойки.

Математически данный процесс перебора можно записать так: 4*4*4*4*4 = 1024. В роле младшей карты Стрита могут выступать десять карт от Туза до Десятки. Умножая 1024 (это количество стритов с заданной младшей картой) на 10 возможных таких младших карт получаем 1024*10=10240. В эту цифру вошли также все Флеш-Стриты и Роял-Флеши.

Итого: точное количество всех возможных Стритов в покере есть 10240 -


(36+4) = 10200


Роял-Флеш 4

Флеш-Стрит 36

Каре 624

Фул-Хаус 3744

Флеш 5108

Стрит 10200

Тройка ?

Две Пары ?

Пара ?


Помним, что число способов получить три разных карты одного ранга

43=4!/3!*(4-3)!=4


Теперь, чтобы составить пятикарточную комбинацию Тройка, нам необходимы еще две произвольные карты из оставшейся колоды. Этих карт 48. Опять применяем формулу количества сочетаний из числа n по m.

nm = n!/m!*(n-m)!

Нам нужно знать, сколько разных вариантов из 2-х карт можно «вытянуть» из 48 карт

= 48; m=2 имеем:482= 48!/2!*(48-2)!= 1128


Для тех, кто не знает, что в вычислении C482 калькулятор не поможет, по причине того, что значение факториала 48-ми содержит слишком много разрядов скажу, что путем простого сокращения дроби это выражение приводится к виду 48*47/2. Калькулятор нам пригодится только чтобы посчитать произведение 48*47 и поделить на 2.

Чем меньше m, тем к более простому виду можно привести полученное выражение, это придает данной формуле еще одно достоинство - то, что во многих практических случаях вам и калькулятор не понадобится.

Чтобы подсчитать количество пятикарточных комбинаций Тройка одного определенного ранга нужно умножить (число первое) на (число второе).


*1128=4512


Далее, умножаем на количество рангов карт 4512*13=58656

Осталось вычесть из этого числа количество Фул-Хаусов 3744.


-3744=54912.


Число пятикарточных комбинаций Тройка равно 54912.

Помним, что получить из четырех карт одного ранга две парные карты можно шестью способами: C42=4!/2!*(4-2)!=6 число вариантов парных карт одного ранга.

Первая пара может быть любой из шести каждого ранга. Поэтому всего пар из целой колоды можно вытянуть 6*13=78

Теперь добавляем к первой паре вторую. Вторая пара может быть любой из оставшихся двенадцати рангов карт 6*12=72 Произведение 78*72 есть число возможных четырехкарточных комбинаций Две Пары. 78*72=5616

В число 5616 входят повторяющиеся комбинации, такие как два Туза в составе первой пары, и комбинации, имеющие два туза в составе второй пары. Очевидно, что названные комбинации являются одинаковыми, то есть каждой четырехкарточной комбинации АА99 соответствует комбинация близнец 99АА. Чтобы получить истинное количество четырехкарточных комбинаций Две Пары разделим найденное число на два.


/2 = 2808


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

То есть любой из сорока четырех 52-4-4=44

Умножая число возможных четырехкарточных комбинаций Две Пары на 44 получим123552 - число возможных пятикарточных комбинаций Две Пары.


*44=123552


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

Всего пар в колоде 6*13=78

Находим, сколько разных вариантов из 3-х карт можно «вытянуть» из 48 карт

= 48; m=3 имеем: C483= 48!/3!*(48-3)!=48*47*46/3*2*1=17296

*78=1349088


Делая выборку из 48 карт по 3, мы не учитывали возможные совпадения их рангов. Поэтому из полученного числа 1349088 необходимо вычесть количество Фул-Хаусов 3744, а также удвоенное число комбинаций две пары 123552*2=247104.

-3744-247104=1098240 - число пятикарточных комбинаций содержащих Пару.

Роял-Флеш

Флеш-Стрит 36

Каре 624

Фул-Хаус 3744

Флеш 5108

Стрит 10200

Тройка 54912

Две Пары 123552

Пара 1098240

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

Последний раз применим и закрепим универсальную формулу:

525= 52!/5!*(52-5)!=52*51*50*49*48/5*4*3*2*1=2598960


Всего вариантов пятикарточных рук 2598960

Итого, вероятность прихода Роял-Флеш 4/2598960=0,00000154 (В процентах 0,000154)

Аналогично считаем для остальных комбинаций

Вероятности образования комбинаций с раздачи в оазис покере.

Таблица 1


Текст программы


#include <iostream>

#include <cstdlib>

#include <string>

#include <ctime>namespace std;main()

{(time(NULL));deck[52];i;suitnames[4]={"spades", "diamonds", "clubs", "hearts"};ranknames[13]={"2", "3", "4", "5", "6", "7", "8", "9", "10", "jack", "queen", "king", "ace"};

// создать колоду, с картами в порядке, но рангу

for(i=0; i<52; i++)

{[i] = i;

}

// тасует колоду:(i=0; i<52; i++)

{

//генерировать случайные индекс, чтобы заменить карту в индексе i.

int j = rand() % 52;temp = deck[i];[i] = deck[j];[j] = temp;

}

//Получить звание карт

int R[5];

int S[5];(i=0; i<5; i++)

{[i] = deck[i]%13;[i] = deck[i]/13;

}

// Сортировка массива R

bool swapped = false;

{= false;(int i=0; i<5; i++)

{(R[i] > R[i+1])

{temp = R[i];[i] = R[i+1];[i+1] = temp; = true;

}

// проверка на выпадение идэнтичных карт в паре

if (R[0]==R[1])

{ if (S[0] == S[1])

{S[1]=S[i++];

}

};(R[2]==R[1])

{ if (S[2] == S[1])

{S[2]=S[i++];

}

};(R[3]==R[2])

{ if (S[2] == S[3])

{S[3]=S[i++];

}

};(R[3]==R[4])

{ if (S[3] == S[4])

{S[3]=S[i++];

}

};

}

// проверка на выпадение идэнтичных карт в тройке

if (R[0]==R[1]==R[2])

{ if (S[0] == S[1])

{S[1]=S[i++];

}(S[0] == S[2])

{S[2]=S[i++];

}(S[2] == S[1])

{S[2]=S[i++];

}

};(R[1]==R[2]==R[3])

{ if (S[2] == S[1])

{S[2]=S[i++];

}(S[2] == S[3])

{S[3]=S[i++];

}(S[1] == S[3])

{S[1]=S[i++];

}

};(R[2]==R[3]==R[4])

{ if (S[2] == S[3])

{S[2]=S[i++];

}(S[3] == S[4])

{S[3]=S[i++];

} (S[2] == S[4])

{S[2]=S[i++];

}

};

// проверка на выпадение идэнтичных карт в каре

if (R[2]==R[3]==R[4]==R[1])

{ if (S[2] == S[3])

{S[2]=S[i++];

}(S[3] == S[4])

{S[3]=S[i++];

}(S[2] == S[4])

{S[2]=S[i++];

}(S[1] == S[2])

{S[2]=S[i++];

}(S[1] == S[3])

{S[3]=S[i++];

}(S[1] == S[4])

{S[1]=S[i++];

}

};(R[2]==R[3]==R[0]==R[1])

{ if (S[2] == S[3])

{S[2]=S[i++];

}(S[3] == S[0])

{S[3]=S[i++];

}(S[2] == S[0])

{S[0]=S[i++];

}(S[1] == S[2])

{S[2]=S[i++];

}(S[1] == S[3])

{S[3]=S[i++];

}(S[1] == S[04])

{S[0]=S[i++];

}

};

}(swapped == true);

// вывести масть и ранг

for(i=0; i<5; i++)

{<< ranknames[R[i]] << " of " << suitnames[S[i]]<< "\n";

}

// 1)Проверьте пары

if(R[0] == R[1] || R[1]==R[2] || R[2]==R[3] || R[3]==R[4] || R[0]==R[2] || R[1]==R[3] || R[2]==R[4] || R[0]==R[3] || R[1]==R[4])

{<< "\n\nYou got a pair!" << endl;

}

{<< "\n\n No pair" << endl;

}

//2)Проверьте на 2 пары

if(R[i]==R[1])

{ if(R[3]==R[4])

{ cout << "You got a two pairs!" << endl;

}

}(R[2]==R[1])

{ if(R[3]==R[4])

{ cout << "You got a two pairs!" << endl;

}

}(R[0]==R[1])

{ if(R[3]==R[2])

{ cout << "You got a two pairs!" << endl;

}

}

{<< " No two pairs" << endl;

}

// 3)Проверить тройку

if(R[0]==R[1] && R[1]==R[2] || R[1]==R[2] && R[2]==R[3] || R[2]==R[3] && R[2]==R[4])

{<< "You got a three of a kind!" << endl;

}

{<< " No three of a kind" << endl;

}

// 4)Проверить стрит:

if(R[1]==R[0]+1 && R[2]==R[1]+1 && R[3]==R[2]+1 && R[4]==R[3]+1)

{<< "You got a straight!" << endl;

}

{<< " No straight" << endl;

}

// 5)Проверьте флеш

if(S[0] == S[1] && S[1]==S[2] && S[2]==S[3] && S[3]==S[4])

{<< "You got a flush!" << endl;

}

{<< " No flush" << endl;

}

//6)Проверьте фул хаус

if(R[0]==R[1] && R[1]==R[2] && R[3]==R[4] || R[2]==R[3] && R[2]==R[4] && R[0]==R[1])

{<< "You got Full House!" << endl;

}

{<< " No Full House" << endl;

}

//7)каре

if(R[0]==R[1] && R[1]==R[2] && R[1]==R[3] || R[1]==R[2] && R[2]==R[3] && R[2]==R[4])

{<< "You got four of a kind!" << endl;

}

{<< " No four of a kind" << endl;

}

//8)Проверьте, стрит-флеш(R[1]==R[0]+1 && R[2]==R[1]+1 && R[3]==R[2]+1 && R[4]==R[3]+1 && S[0] == S[1] && S[1]==S[2] && S[2]==S[3] && S[3]==S[4])

{<< "You got a flush-straight!" << endl;

}

{<< " No flush-straight" << endl;

}

// 9)флэш-рояль

if(S[0]==S[1] && S[1]==S[2] && S[2]==S[3] && S[3]==S[4])

{

{if (R[0]==8 && R[1]==9 && R[2]==10 && R[3]==11 && R[4]==12 )<< "You got ROYAL FLUSH!" << endl;

}

}

{<< " No ROYAL FLUSH" << endl;

} ("pause");0;

}

Результат выполнения программы при различных вариантах входных файлов


Из табл. 1 не трудно подсчитать, что то что шанс что у вас на руках не выпадет ни одна комбинация старше пары равна 50.12% , примерно так же программа написанная мной выдаёт разные карточные вариации не являющиеся старше пары. Например:



С вероятность 42,26% вам может выпасть комбинация Пара. Например:



Комбинация Две Пары. Пример:


Комбинация Тройка. Пример:



Комбинация Стрит. Пример:



Ещё с меньшей вероятностью у вас может выпасть Флеш. Пример:


Если вам выпадет Фул-Хаус то вы перед собой сможете увидеть примерно такую картину . Пример:



Каре. Пример:



Как показывают расчёты, выпадение Стрит-Флеша и Флеш-Рояля крайне малы, к сожалению при проверке мной данной программы данные комбинации не выпадали, но магу вас заверить в том, что программа работает правильно и при выпадении данных комбинаций она даст вам знать.

программа масть карта покерный

Вывод


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

Так же в ходе работы была рассчитана вероятность выпадения покерных комбинаций в разных интерпретациях.

Список литературы


В.И. Шупляк «Практический курс. С++. Учебное пособие»

Бьерн Страуструп «Язык программирование С++»

Дэвид Склански «Теория покера»


Министерство образования Республики Беларусь Белорусский национальный технический университет Энергетический факультет Кафедра «Тепловые электриче

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ