Estimate Probabilities Of Card Games

We are going to show how we can estimate card probabilities by applying Monte Carlo Simulation and how we can solve them numerically in Python. The first thing that we need to do is to create a deck of 52 cards.

How to Generate a Deck of Cards

import itertools, random
# make a deck of cards
deck = list(itertools.product(['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'],['Spade','Heart','Diamond','Club']))
deck

And we get:

[('A', 'Spade'),
('A', 'Heart'),
('A', 'Diamond'),
('A', 'Club'),
('2', 'Spade'),
('2', 'Heart'),
('2', 'Diamond'),
('2', 'Club'),
('3', 'Spade'),
('3', 'Heart'),
('3', 'Diamond'),
('3', 'Club'),
('4', 'Spade'),
('4', 'Heart'),
('4', 'Diamond'),
('4', 'Club'),
('5', 'Spade'),
('5', 'Heart'),
...
Big Data Jobs
]

How to Shuffle the Deck

# shuffle the cards
random.shuffle(deck)
deck[0:10]

And we get:

[('6', 'Club'),
('8', 'Spade'),
('J', 'Heart'),
('10', 'Heart'),
('Q', 'Spade'),
('7', 'Diamond'),
('K', 'Diamond'),
('J', 'Club'),
('J', 'Diamond'),
('A', 'Club')]

How to Sort the Deck

For some probabilities where the order does not matter, a good trick is to sort the cards. The following commands can be helpful.

# sort the deck
sorted(deck)
# sort by face
sorted(deck, key = lambda x: x[0])
# sort by suit
sorted(deck, key = lambda x: x[1])

How to Remove Cards from the Deck

Depending on the Games and the problem that we need to solve, sometimes there is a need to remove from the Deck the cards which have already been served. The commands that we can use are the following:

# assume that card is a tuple like ('J', 'Diamond')
deck.remove(card)
# or we can use the pop command where we remove by the index
deck.pop(0)
# or for the last card
deck.pop()

Trending AI Articles:

1. Microsoft Azure Machine Learning x Udacity — Lesson 4 Notes

2. Fundamentals of AI, ML and Deep Learning for Product Managers

3. Roadmap to Data Science

4. Work on Artificial Intelligence Projects

Part 1: Estimate Card Probabilities with Monte Carlo Simulation

Question 1: What is the probability that when two cards are drawn from a deck of cards without a replacement that both of them will be Ace?

Let’s say that we were not familiar with formulas or that the problem was more complicated. We could find an approximate probability with a Monte Carlo Simulation (10M Simulations)

N = 10000000
double_aces = 0
for hands in range(N):
# shuffle the cards
random.shuffle(deck)
aces = [d[0] for d in deck[0:2]].count('A')
if aces == 2:
double_aces+=1
prob = double_aces/N
prob

And we get 0.0045214 where the actual probability is 0.0045

Question 2: What is the probability of two Aces in 5 card hand without replacement.

FYI: In case you want to solve it explicitly by applying mathematical formulas:

from scipy.stats import hypergeom
# k is the number of required aces
# M is the total number of the cards in a deck
# n how many aces are in the deck
# N how many aces cards we will get
hypergeom.pmf(k=2,M=52, n=4, N=5)

And we get 0.03992981808107859. Let’s try to solve it by applying simulation:

N = 10000000
double_aces = 0
for hands in range(N):
# shuffle the cards
random.shuffle(deck)
aces = [d[0] for d in deck[0:5]].count('A')
if aces == 2:
# print(deck[0:2])
double_aces+=1
prob = double_aces/N
prob

And we get 0.0398805. Again, quite close to the actual probability

Question 3: What is the probability of being dealt a flush (5 cards of all the same suit) from the first 5 cards in a deck?

If you would like to see the mathematical solution of this question you can visit PredictiveHacks. Let’s solve it again by applying a Monte Carlo Simulation.

N = 10000000
flushes = 0
for hands in range(N):
# shuffle the cards
random.shuffle(deck)
flush = [d[1] for d in deck[0:5]]
if len(set(flush))== 1:
flushes+=1
prob = flushes/N
prob

And we get 0.0019823 which is quite close to the actual probability which is 0.00198.

Question 4: What is the probability of being dealt a royal flush from the first 5 cards in a deck?

The actual probability of this case is around 0.00000154. Let’s see if the Monte Carlo works with such small numbers.

# royal flush
N = 10000000
royal_flushes = 0
for hands in range(N):
# shuffle the cards
random.shuffle(deck)
flush = [d[1] for d in deck[0:5]]
face = [d[0] for d in deck[0:5]]
if len(set(flush))== 1 and sorted(['A','J', 'Q', 'K', '10'])==sorted(face):
royal_flushes+=1
prob = royal_flushes/N
prob

And we get 1.5e-06 which is a very good estimation.

Part 2: Calculate Exact Card Probabilities Numerically

Above, we showed how we can calculate the Card Probabilities explicitly by applying mathematical formulas and how we can estimate them by applying Monte Carlo Simulation. Now, we will show how we can get the exact probability using Python. This is not always applicable but let’s try to solve the questions of Part 1.

The logic here is to generate all the possible combinations and then to calculate the ratio. Let’s see how we can get all the possible 5-hand cards of a 52-card deck.

# importing modules
import itertools
from itertools import combinations
# make a deck of cards
deck = list(itertools.product(['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'], ['Spade','Heart','Diamond','Club']))
# get the (52 5) combinations
all_possible_by_5_combinations = list(combinations(deck,5))
len(all_possible_by_5_combinations)

And we get 2598960 as expected.

Question 1: What is the probability that when two cards are drawn from a deck of cards without a replacement that both of them will be Ace?

# importing modules
import itertools
from itertools import combinations
# make a deck of cards
deck = list(itertools.product(['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'], ['Spade','Heart','Diamond','Club']))
# get the (52 2) combinations
all_possible_by_2_combinations = list(combinations(deck,2))
Aces = 0
for card in all_possible_by_2_combinations:
if [d[0] for d in card].count('A') == 2:
Aces+=1
prob = Aces / len(all_possible_by_2_combinations)
prob

And we get 0.004524886877828055.

Question 2: What is the probability of two Aces in 5 card hand without replacement.

# get the (52 5) combinations
all_possible_by_5_combinations = list(combinations(deck,5))
Aces = 0
for card in all_possible_by_5_combinations:
if [d[0] for d in card].count('A') == 2:
Aces+=1
prob = Aces / len(all_possible_by_5_combinations)
prob

And we get 0.03992981808107859

Question 3: What is the probability of being dealt a flush (5 cards of all the same suit) from the first 5 cards in a deck?

# get the (52 5) combinations
all_possible_by_5_combinations = list(combinations(deck,5))
flushes  = 0
for card in all_possible_by_5_combinations:
flush = [d[1] for d in card]
if len(set(flush))== 1:
flushes+=1
prob = flushes / len(all_possible_by_5_combinations)
prob

And we get 0.0019807923169267707

Question 4: What is the probability of being dealt a royal flush from the first 5 cards in a deck?

# get the (52 5) combinations
all_possible_by_5_combinations = list(combinations(deck,5))
royal_flushes   = 0
for card in all_possible_by_5_combinations:
flush = [d[1] for d in card]
face = [d[0] for d in card]
if len(set(flush))== 1 and sorted(['A','J', 'Q', 'K', '10'])==sorted(face):
royal_flushes +=1
prob = royal_flushes  / len(all_possible_by_5_combinations)
prob

And we get 1.5390771693292702e-06

Discussion

Computing Power enables us to estimate and even calculate complicated probabilities without being necessary to be experts in Statistics and Probabilities. In this post, we provided some relatively simple examples. The same logic can be extended to more advanced and complicated problems in many fields, like simulating card games, lotteries, gambling games etc.


Estimate Probabilities Of Card Games was originally published in Becoming Human: Artificial Intelligence Magazine on Medium, where people are continuing the conversation by highlighting and responding to this story.

Via https://becominghuman.ai/estimate-probabilities-of-card-games-3ae50adb75c7?source=rss—-5e5bef33608a—4

source https://365datascience.weebly.com/the-best-data-science-blog-2020/estimate-probabilities-of-card-games

Published by 365Data Science

365 Data Science is an online educational career website that offers the incredible opportunity to find your way into the data science world no matter your previous knowledge and experience. We have prepared numerous courses that suit the needs of aspiring BI analysts, Data analysts and Data scientists. We at 365 Data Science are committed educators who believe that curiosity should not be hindered by inability to access good learning resources. This is why we focus all our efforts on creating high-quality educational content which anyone can access online.

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Design a site like this with WordPress.com
Get started