Curso
Cientistas de dados criam modelos de machine learning para fazer previsões e otimizar decisões. No pôquer online, as opções são apostar, pagar ou desistir. Você não pode usar software para tomar essas decisões. É aí que a maioria dos sites de pôquer online traça o limite nas regras. Como você não pode treinar um modelo de machine learning, precisa treinar o cérebro. Isso exige um fluxo interminável de cálculos de equity fora da mesa, que usam diversos conceitos de probabilidade e estatística.
Neste tutorial, você vai aprender alguns desses conceitos usando um baralho de cartas e situações genéricas de pôquer.

Se você quer mergulhar em estatística com Python, confira o curso Statistical Thinking in Python da DataCamp.
Motivação pessoal
Por vários anos, vivi de pôquer online profissionalmente. Data science foi uma evolução natural, já que exige um conjunto de habilidades parecido com o de ganhar dinheiro no pôquer online. Escrevi um blog sobre o que data science tem em comum com pôquer, e comentei que, a cada mão jogada em um site de pôquer online, é gerado um histórico. Esses históricos descrevem tudo o que cada jogador fez naquela mão. Usei um software chamado Hold’em Manager (pense no Tableau do pôquer) para aproveitar esses dados. O Hold'em Manager baixa cada um desses históricos em tempo real para um banco PostgreSQL, para que você possa acompanhar as tendências dos seus oponentes.
Teoria das probabilidades: uma introdução
Antes de pôr a mão na massa, vale entender o que é teoria das probabilidades e por que ela é importante quando você começa em data science. Além disso, você verá alguns conceitos-chave úteis ao longo do tutorial e aprenderá a calcular a probabilidade de eventos simples.
No dia a dia, é comum se perguntar quais são as chances de certo evento acontecer, como ganhar na loteria, seu time de futebol vencer ou rolar uma promoção no seu tênis favorito. "Quais são as chances de..." é uma expressão que você provavelmente usa bastante. Determinar as chances de um evento ocorrer é o que chamamos de "probabilidade".
Esse tipo de probabilidade difere da visão matemática encontrada na teoria das probabilidades, um ramo da matemática. E, nesse campo, há duas interpretações amplas do que é "probabilidade": as probabilidades "físicas" e as "evidenciais".
As primeiras também são chamadas de objetivas ou de frequência e estão associadas a sistemas físicos aleatórios, como lançar moedas, roletas ou dados. Nesses sistemas, um tipo de evento tende a ocorrer a uma taxa persistente, ou "frequência relativa", em uma longa série de tentativas.
As segundas são conhecidas como probabilidades bayesianas, que podem ser atribuídas a qualquer afirmação, mesmo sem um processo aleatório envolvido, como uma forma de representar sua plausibilidade subjetiva, ou o grau em que a afirmação é sustentada pelas evidências disponíveis. Em muitas abordagens, probabilidades evidenciais são vistas como graus de crença, definidos em termos de disposição para apostar em certas odds.
Observação: a teoria das probabilidades se preocupa principalmente em prever a chance de eventos futuros, enquanto a estatística analisa a frequência de eventos passados. Isso também explica por que a teoria das probabilidades é um dos pilares para quem quer ser cientista de dados: em data science e machine learning, você usa dados de eventos que já ocorreram para prever eventos futuros.
Então, embora a teoria das probabilidades seja considerada difícil de entender de forma intuitiva, seus conceitos são essenciais para data science e análises preditivas.
Conceitos e símbolos essenciais
Alguns conceitos-chave que você deve conhecer para este tutorial estão ligados à perspectiva frequentista de probabilidade, já que aqui trabalhamos com um baralho de 52 cartas.
Nessa perspectiva, o ingrediente fundamental é um experimento que pode ser repetido, ao menos hipoteticamente, sob condições essencialmente idênticas. Esse experimento pode levar a desfechos diferentes em diferentes tentativas (execuções únicas do experimento). O conjunto de todos os possíveis resultados de um experimento é chamado de "espaço amostral". Um evento é um subconjunto bem definido do espaço amostral.
Isso é bastante teórico.
Vamos ver alguns exemplos:
- Um exemplo clichê é lançar uma moeda. O experimento é o próprio lançamento. Você pode lançá-la várias vezes, e cada tentativa pode ter resultados diferentes. Como há dois resultados possíveis — cara ou coroa — o espaço amostral tem 2 elementos. O evento "lançar uma moeda" pode, por exemplo, consistir em um único resultado "cara". Da mesma forma, se você lançar duas vezes, o evento "a primeira dá cara" pode ter resultado "cara-cara" ou "cara-coroa".
- Outro exemplo: girar um globo e pará-lo com o dedo. Você pode repetir várias vezes e obter resultados diferentes — seu dedo pode cair em terra ou água. O espaço amostral tem 2 elementos. Um evento "meu dedo cai em terra" pode ter resultado "terra - água" ou "terra - terra".
- Por fim, lançar um dado. Você pode lançá-lo várias vezes e obter resultados diferentes: 6, para ser exato, pois o dado tem 6 faces (1,2,3,4,5,6). Um evento "a soma de dois lançamentos é 10" pode consistir de combinações que somam 10, enquanto o evento "o número é par" pode consistir de 2, 4 ou 6.
Agora que você tem a ideia dos conceitos que usará no tutorial, é hora de ver alguns símbolos de probabilidade que também vão aparecer:
| Símbolo | Significado |
|---|---|
| $$\cap$$ | E |
| $$\cup$$ | Ou |
| | | Dado que |
Calculando a probabilidade de eventos simples
Com tudo em dia, você pode começar a determinar a probabilidade de um evento único, como uma moeda cair em coroa. Para calcular essa probabilidade, divida o número de resultados favoráveis pelo tamanho do espaço amostral.
Ou seja, primeiro considere quantas formas possíveis há de a moeda cair em coroa e quantos resultados possíveis existem. O primeiro número é 1, pois só há uma forma de sair coroa. O segundo é 2, pois o lançamento resulta em cara ou coroa.
Resumindo, o cálculo da probabilidade de um evento A fica assim:
$$P(A) = \frac{Event \ outcomes \ favorable \ to \ A}{Sample \ space}$$
No caso do lançamento da moeda, a probabilidade de sair coroa é 1/2 ou 0,5.
Observação: a probabilidade sempre está entre 0 e 1, onde 0 indica que é muito improvável o evento acontecer e 1 indica que é certo o evento acontecer.
Agora vamos a um segundo exemplo em que você calcula a probabilidade de um evento.

Um baralho padrão tem 52 cartas e, dessas 52, 4 são ases. Seguindo o exemplo da moeda para saber a probabilidade de comprar um ás, você divide o número de resultados favoráveis (4) pelo espaço amostral (52):
$$P(A) = \frac{4}{52}$$
Observação: $A$ representa o evento "comprar um ás".
Agora, determine a probabilidade de comprar um ás com a ajuda do Python:
# Sample Space
cards = 52
# Outcomes
aces = 4
# Divide possible outcomes by the sample set
ace_probability = aces / cards
# Print probability rounded to two decimal places
print(round(ace_probability, 2))
0.08
A probabilidade de comprar um ás em um baralho padrão é 0,08. Para obter a probabilidade em porcentagem, basta multiplicar por 100.
# Ace Probability Percent Code
ace_probability_percent = ace_probability * 100
# Print probability percent rounded to one decimal place
print(str(round(ace_probability_percent, 0)) + '%')
8.0%
A probabilidade de comprar um ás em porcentagem é 8%.
Depois de ver dois exemplos de cálculo de probabilidades, é natural pensar em ampliar as contas para descobrir, por exemplo, a probabilidade de comprar uma carta de Copas, uma carta de figura (Valete, Dama ou Rei) ou uma combinação de ambos, como a Dama de Copas.
Nesses casos, vale criar uma função definida pelo usuário (UDF) event_probability() para a qual você passa event_outcomes e sample_space a fim de obter a probabilidade de um evento em porcentagem, já que você vai reutilizar bastante código:
# Create function that returns probability percent rounded to one decimal place
def event_probability(event_outcomes, sample_space):
probability = (event_outcomes / sample_space) * 100
return round(probability, 1)
# Sample Space
cards = 52
# Determine the probability of drawing a heart
hearts = 13
heart_probability = event_probability(hearts, cards)
# Determine the probability of drawing a face card
face_cards = 12
face_card_probability = event_probability(face_cards, cards)
# Determine the probability of drawing the queen of hearts
queen_of_hearts = 1
queen_of_hearts_probability = event_probability(queen_of_hearts, cards)
# Print each probability
print(str(heart_probability) + '%')
print(str(face_card_probability) + '%')
print(str(queen_of_hearts_probability) + '%')
25.0%
23.1%
1.9%
Esses resultados não surpreendem: como esperado, as chances de comprar a Dama de Copas são bem menores do que as de comprar uma carta de figura qualquer ou uma de Copas.
Probabilidade com combinações e permutações
Você viu na seção anterior que determinar o tamanho do espaço amostral é fundamental para calcular probabilidades. Porém, isso nem sempre é trivial!
Felizmente, há formas de facilitar a contagem. Duas delas são permutações e combinações. Nesta seção, você verá o que significam e como usá-las para calcular o tamanho do espaço amostral.
Permutações
Permutações são o número de maneiras de arranjar um subconjunto de tamanho especificado a partir de um conjunto dado, geralmente sem reposição. Um exemplo é um PIN de 4 dígitos sem dígitos repetidos. A quantidade de PINs possíveis sem repetição é:
$$10 \times 9 \times 8 \times 7$$.
Você tem 10 números para escolher, mas como é sem reposição, uma opção sempre sai a cada escolha para o PIN de 4 dígitos. No primeiro dígito, há 10 opções (0 a 9); no segundo, só 9; e assim por diante.
De forma mais geral, o parágrafo anterior considera duas coisas: (1) a quantidade total de números disponíveis e (2) a quantidade que você realmente escolhe. No exemplo, 10 é a quantidade de dígitos disponíveis (0 a 9). Já a quantidade escolhida é 4, pois o PIN tem 4 dígitos.
Ao calcular permutações, você considera o conjunto completo disponível, que é na verdade $$10 \times 9 \times 8 \times 7 \times 6 \times 5 \times 4 \times 3 \times 2 \times 1$$ e divide o resultado pela diferença entre o total disponível (10) e o que você escolhe (4). Em termos de fatoriais, essa diferença é $$6 \times 5 \times 4 \times 3 \times 2 \times 1$$.
Observação: você também pode escrever assim
$$10P4 = \frac{10!}{(10 - 4)!}$$
Note que aparecem "10!" e "6!" (10 fatorial e 6 fatorial), indicando que todos os inteiros positivos consecutivos de 1 até 10 ou 6 devem ser multiplicados.
O resultado é 5040 permutações. Observação: isso é exatamente igual ao cálculo feito ao multiplicar 10, 9, 8 e 7.
Generalizando, a fórmula de permutações é:
$$nPk = \frac{n!}{(n - k)!}$$
Vamos praticar com um exemplo!
Para encontrar o número de permutações de ases na mão inicial (pocket aces), escolhendo apenas 2, considere o conjunto completo de ases (4) e a quantidade escolhida (2):
$$4P2 = \frac{4!}{(4 - 2)!}$$
Combinações
Você viu que em permutações a ordem importa. Em combinações, não: a ordem não importa. Combinações são o número de formas de selecionar um subconjunto de tamanho especificado a partir de um conjunto dado.
Exemplo: você tem um baralho com 52 cartas. Três cartas serão retiradas. De quantas maneiras diferentes você pode escolher essas três cartas?
Isso seria $$52 \times 51 \times 50$$, que é o mesmo raciocínio das permutações. Porém, em combinações, a ordem não entra. Assim, para saber o número de combinações, crie todas as permutações e divida pelas redundâncias, isto é, $$3 \times 2 \times 1$$.
O cálculo fica:
$$52C3 = \frac{\frac {52!}{(52-3)!}}{3!}$$
Generalizando:
$$nCk = \frac{nPk}{k!}$$
Note que o numerador é a mesma fórmula de permutações, enquanto o denominador é o fatorial do tamanho do subconjunto escolhido.
Considere outro exemplo com ases. Há quatro ases em um baralho, e estas são todas as combinações de pocket aces:
- Ás de Copas / Ás de Ouros
- Ás de Copas / Ás de Paus
- Ás de Copas / Ás de Espadas
- Ás de Ouros / Ás de Paus
- Ás de Ouros / Ás de Espadas
- Ás de Paus / Ás de Espadas
Existem seis combinações de pocket aces. Para achar o número de combinações, primeiro encontre o número de permutações:
# Permutations Code
import math
n = 4
k = 2
# Determine permutations and print result
Permutations = math.factorial(n) / math.factorial(k)
print(Permutations)
12.0
Para determinar o número de combinações, divida o número de permutações pelo fatorial do tamanho do subconjunto. Tente descobrir o número de combinações de mãos iniciais possíveis em Texas Hold’em.
$$52C2 = \frac{52P2}{2!}$$
# Combinations Code
n = 52
k = 2
# Determine Permutations
Permutations = math.factorial(n) / math.factorial(n - k)
# Determine Combinations and print result
Combinations = Permutations / math.factorial(k)
print(Combinations)
1326.0
Eventos independentes vs. dependentes
Você leu na introdução que um evento é um subconjunto bem definido do espaço amostral. Eventos podem ser classificados em duas categorias: dependentes ou independentes.
Eventos independentes não afetam a probabilidade um do outro. Dois eventos A e B são independentes se saber que A ocorreu não dá informação sobre B.
Isso é verdade quando, por exemplo, você compra um ás, devolve a carta ao baralho, embaralha e compra outra carta. A probabilidade de comprar um ás na primeira compra é a mesma da segunda.
Eventos dependentes, por sua vez, afetam a probabilidade dos demais.
Por exemplo, você compra uma carta e depois compra a segunda sem repor a primeira. Nesse caso, a probabilidade de comprar um ás na primeira compra não é igual à da segunda compra. Depois da primeira carta, o espaço amostral diminui de 52 para 51. Dependendo da primeira carta, o número de resultados favoráveis também muda. Se a primeira foi um ás, restam apenas 3 ases na segunda compra.
Agora, em termos formais. Eventos A e B (com probabilidade não nula) são independentes se, e somente se, uma das seguintes afirmações equivalentes valer: $$P (A ∩ B) = P(A)P(B)$$ $$P (A|B) = P(A)$$ $$P (B|A) = P(B)$$
Ou seja, A e B são independentes se:
- A probabilidade de A e B ocorrerem é igual ao produto das probabilidades de cada um.
- A probabilidade de A ocorrer dado que B ocorreu é igual à probabilidade de A ocorrer.
- A probabilidade de B ocorrer dado que A ocorreu é igual à probabilidade de B ocorrer.
Considere o exemplo a seguir: você já sabe a probabilidade de comprar um ás na primeira compra. Agora determine a probabilidade de comprar um ás na segunda compra, se a primeira carta foi um rei ou um ás:
# Sample Space
cards = 52
cards_drawn = 1
cards = cards - cards_drawn
# Determine the probability of drawing an Ace after drawing a King on the first draw
aces = 4
ace_probability1 = event_probability(aces, cards)
# Determine the probability of drawing an Ace after drawing an Ace on the first draw
aces_drawn = 1
aces = aces - aces_drawn
ace_probability2 = event_probability(aces, cards)
# Print each probability
print(ace_probability1)
print(ace_probability2)
7.8
5.9
Há algumas situações comuns no pôquer que são relevantes para eventos dependentes.
Antes, um pouco de contexto. O jogo é Texas Hold’em. Jogada com um baralho padrão de 52 cartas, essa é a variação mais popular. Cada jogador recebe duas cartas para começar a mão e fará a melhor mão de cinco cartas combinando suas duas cartas com as cinco cartas comunitárias distribuídas ao longo da mão. As cartas são distribuídas em quatro rodadas:
- Pré-flop: cada jogador recebe duas cartas, as "hole cards"
- Flop: são distribuídas três cartas comunitárias
- Turn: é distribuída uma carta comunitária
- River: é distribuída a última carta comunitária
Eventos dependentes: flush draw
Sua mão

Cartas comunitárias

Você está no turn e tem quatro cartas para um flush de Ás alto. Flush é uma mão forte em que as cinco cartas são do mesmo naipe. Qual a probabilidade de a última carta comunitária, o river, ser de Ouros?
# Sample Space
cards = 52
hole_cards = 2
turn_community_cards = 4
cards = cards - (hole_cards + turn_community_cards)
# Outcomes
diamonds = 13
diamonds_drawn = 4
# In poker, cards that complete a draw are known as "outs"
outs = diamonds - diamonds_drawn
#Determine river flush probability
river_flush_probability = event_probability(outs, cards)
print(river_flush_probability)
19.6
Há cerca de 20% de chance de completar seu flush no river. Veja outro caso:
Eventos dependentes: open-ended straight draw
Sua mão

Cartas comunitárias

Você está no turn e tem um straight draw aberto. Straight é outra mão forte, com cinco cartas em sequência. O draw é aberto porque qualquer oito (8, 9, 10, Valete, Dama) ou qualquer rei (9, 10, Valete, Dama, Rei) completa a sequência.
Qual a probabilidade de o river completar a sequência?
# Sample Space
cards = 52
hole_cards = 2
turn_community_cards = 4
cards = cards - (hole_cards + turn_community_cards)
# Outcomes
eights = 4
kings = 4
outs = eights + kings
# Determine river straight probability
river_straight_probability = event_probability(outs, cards)
print(river_straight_probability)
17.4
Há cerca de 17% de chance de completar a sequência no river.
Múltiplos eventos
Até aqui, você considerou um único evento ao calcular probabilidades. E quando há vários eventos?
Um exemplo: "qual a probabilidade de comer três cookies de aveia seguidos de um cookie com gotas de chocolate ao pegar quatro cookies de um pote com esses dois tipos?" Comer quatro cookies são quatro eventos.
Para calcular a probabilidade de múltiplos eventos, você determina o número de eventos (4 neste caso), depois calcula a probabilidade de cada evento separadamente e multiplica todas para obter a resposta final. No exemplo acima, seria 0,5 x 0,5 x 0,5 x 0,5 = 0,0625.
$$P(Event A \cap Event B)=P(Event A) \times P(Event A)$$
Observação: aqui você calcula as probabilidades de comer um cookie de aveia E outro de aveia E um terceiro de aveia E um último de chocolate. Quando todos os eventos precisam acontecer, você multiplica as probabilidades.
Com o baralho, você poderia perguntar: "Qual a probabilidade de tirar três cartas de Copas sem reposição?". Ao amostrar sem reposição, você escolhe uma carta e não a devolve, então sua seleção final não pode incluir a mesma carta. Neste caso, o cálculo seria 13/52 x 12/51 x 11/50.
Eventos mutuamente exclusivos
Ao trabalhar com múltiplos eventos, você também pode ter eventos mutuamente exclusivos (ou disjuntos): não podem ocorrer ao mesmo tempo. Nesses casos, para calcular a probabilidade (a união) de qualquer um desses eventos ocorrer, você não multiplica — você soma as probabilidades de cada evento:
$$P(Event A \cup Event B) = P(Event A) + P(Event B)$$
É essencial entender o papel do "OU": comprar uma carta de Copas OU uma de Paus são eventos mutuamente exclusivos. Copas é Copas e Paus é Paus. Para determinar a probabilidade de comprar uma de Copas ou de Paus, some as probabilidades individuais.
$$P(Heart \cup Club) = (\frac{13}{52}) + (\frac{13}{52})$$
Agora calcule a probabilidade dos seguintes eventos mutuamente exclusivos:
- Comprar uma de Copas ou uma de Paus;
- Comprar um ás, um rei ou uma dama.
# Sample Space
cards = 52
# Calculate the probability of drawing a heart or a club
hearts = 13
clubs = 13
heart_or_club = event_probability(hearts, cards) + event_probability(clubs, cards)
# Calculate the probability of drawing an ace, king, or a queen
aces = 4
kings = 4
queens = 4
ace_king_or_queen = event_probability(aces, cards) + event_probability(kings, cards) + event_probability(queens, cards)
print(heart_or_club)
print(ace_king_or_queen)
50.0
23.1
Eventos não mutuamente exclusivos
Nem todos os eventos são mutuamente exclusivos: comprar uma carta de Copas ou um ás não é exclusivo. O ás de Copas é ao mesmo tempo ás e Copas. Quando os eventos não são mutuamente exclusivos, você precisa corrigir a sobreposição.
$$P(Event A \cup Event B) = P(Event A) + P(Event B) - P(EventA \cup EventB)$$
Para calcular a probabilidade de comprar uma de Copas ou um ás, some a probabilidade de Copas com a de ás e subtraia a probabilidade de comprar o ás de Copas.
$$P(Heart \cup Ace) = (\frac{13}{52}) + (\frac{4}{52}) - (\frac{1}{52})$$
Calcule a probabilidade dos seguintes eventos não mutuamente exclusivos:
- Comprar uma de Copas ou um ás;
- Comprar uma carta vermelha ou uma carta de figura.
# Sample Space
cards = 52
# Calculate the probability of drawing a heart or an ace
hearts = 13
aces = 4
ace_of_hearts = 1
heart_or_ace = event_probability(hearts, cards) + event_probability(aces, cards) - event_probability(ace_of_hearts, cards)
# Calculate the probability of drawing a red card or a face card
red_cards = 26
face_cards = 12
red_face_cards = 6
red_or_face_cards = event_probability(red_cards, cards) + event_probability(face_cards, cards) - event_probability(red_face_cards, cards)
print(round(heart_or_ace, 1))
print(round(red_or_face_cards, 1))
30.8
61.6
Interseção de eventos independentes
A probabilidade da interseção de dois eventos independentes é determinada multiplicando as probabilidades de cada um ocorrer.
$$P(Event A \cap Event B) = P(Event A) \times P(Event B)$$
Se você quer saber a probabilidade de comprar um ás, repor a carta, embaralhar e comprar outro ás, multiplique a probabilidade de comprar um ás pela probabilidade de comprar um ás.
$$P(Ace \cap Ace) = (\frac{4}{52}) \times (\frac{4}{52})$$
# Sample Space
cards = 52
# Outcomes
aces = 4
# Probability of one ace
ace_probability = aces / cards
# Probability of two consecutive independant aces
two_aces_probability = ace_probability * ace_probability
# Two Ace Probability Percent Code
two_ace_probability_percent = two_aces_probability * 100
print(round(two_ace_probability_percent, 1))
0.6
A probabilidade de comprar dois ases em sequência, de forma independente, é 0,592%. E se o segundo evento for dependente?
Interseção de eventos dependentes
A probabilidade da interseção de dois eventos não independentes (Evento A & Evento B dado A) é determinada multiplicando a probabilidade de A pela probabilidade de B dado A.
$$P(Event A \cap Event B | A) = P(Event A) \times P(Event B | A)$$
A melhor mão inicial em Texas Hold’em é pocket aces. Qual a probabilidade de receber dois ases?
$$P(Ace \cap Ace | Ace) = (\frac{4}{52}) \times (\frac{3}{51})$$
# Sample Space first draw
cards = 52
# Outcomes first draw
aces = 4
# Probability of ace on first draw
first_ace_probability = aces / cards
# Sample Space second draw
cards = cards - 1
# Outcomes second draw
aces = aces - 1
# Probability of ace on second draw after ace on first
second_ace_probability = aces / cards
# Probability of two consecutive aces (dependent)
both_aces_probability = first_ace_probability * second_ace_probability * 100
print(both_aces_probability)
0.4524886877828055
A probabilidade de comprar dois ases em sequência, de forma dependente, é 0,452%. Vamos ver duas situações em que isso aparece na mesa.
Interseção de eventos dependentes: flush draw no flop
Sua mão

Cartas comunitárias

É uma situação parecida com o flush draw acima, mas agora você está no flop e ainda virão duas cartas comunitárias, não apenas uma. Como determinar a probabilidade de completar o flush até o river? Primeiro, liste os cenários possíveis:
- A) Turn de Ouros, River de outro naipe (flush completo)
- B) Turn de outro naipe, River de Ouros (flush completo)
- C) Turn de Ouros, River de Ouros (flush completo)
- D) Turn de outro naipe, River de outro naipe (sem flush)
São só quatro possibilidades, e cada uma é mutuamente exclusiva. Isso significa que, se você somar as probabilidades de cada cenário, o total será 1. Em outras palavras, um desses quatro vai acontecer. Você quer saber a probabilidade de ocorrer A, B ou C. A forma mais simples é determinar a probabilidade do cenário D e subtrair de 1.
# Sample Space on turn
cards = 52
hole_cards = 2
flop_community_cards = 3
cards = cards - (hole_cards + flop_community_cards)
# Outcomes
diamonds = 13
diamonds_drawn = 4
non_diamonds_drawn = 1
outs = diamonds - diamonds_drawn
turn_non_diamonds = cards - outs - non_diamonds_drawn
# Probability of not getting a diamond on the turn
no_diamond_turn_probability = turn_non_diamonds / cards
# Sample Space on river
turn_community_card = 1
cards = cards - turn_community_card
# Outcomes on river
river_non_diamonds = turn_non_diamonds - turn_community_card
# Probability of not getting a diamond on the river
no_diamond_river_probability = river_non_diamonds / cards
# Probability of not getting a flush
no_flush_probability = no_diamond_turn_probability * no_diamond_river_probability
# Probability of getting a flush
flush_probability = 1 - no_flush_probability
flush_probability_percent = flush_probability * 100
# Print probability percent rounded to one decimal place
print(round(flush_probability_percent, 1))
38.4
Agora vamos mudar levemente a mão:
Sua mão

Cartas comunitárias

A situação é parecida com a anterior, com uma grande diferença. Você ainda tem um flush draw, mas desta vez não tem o Ás. Se cair Ouros no turn e no river, há uma boa chance de alguém ter um flush melhor. Determine a probabilidade de cair Ouros no turn ou no river, mas não nos dois. Você já tem a probabilidade de não acertar o flush.
Agora encontre a probabilidade de cair Ouros no turn e no river, some à probabilidade de não acertar o flush e subtraia de 1.
# Sample Space on turn
cards = 52
hole_cards = 2
flop_community_cards = 3
cards = cards - (hole_cards + flop_community_cards)
# Outcomes on turn
diamonds = 13
diamonds_drawn = 4
outs = diamonds - diamonds_drawn
# Probability of diamond on turn
diamond_turn_probability = outs / cards
# Sample Space on river
turn_diamonds = 1
cards = cards - turn_diamonds
# Outcomes on river
river_diamonds = outs - turn_diamonds
# Probability of diamond on river
diamond_river_probability = river_diamonds / cards
# Probability of getting a diamond on the turn and river
two_diamonds_probability = diamond_turn_probability * diamond_river_probability
# Determine the probability of getting only one diamond by the river
one_diamond_probability = 1 - (no_flush_probability + two_diamonds_probability)
one_diamond_probability_percent = one_diamond_probability * 100
# Print probability percent rounded to one decimal place
print(round(one_diamond_probability_percent, 1))
35.1
Valor esperado
Em jogos como pôquer, uma pergunta recorrente é: "quanto eu ganho — ou perco — em média, se jogar repetidamente?". No pôquer não é diferente, especialmente para profissionais!
Se os possíveis resultados do jogo e suas probabilidades podem ser descritos por uma variável aleatória, você pode responder calculando o valor esperado, que é a média ponderada dos resultados, em que cada resultado é ponderado por sua probabilidade.
Ou seja, você simplesmente multiplica o valor total pela probabilidade de ganhar para obter o valor esperado:
$$Expected Value = Total Value \times Probability$$
Qual é o valor esperado se há \$100 (valor total) no pote e sua probabilidade de ganhar o pote é 0,75?
$$Expected Value = \$100 \times 0.75$$
# Initialize `pot` and `probability` variables
pot = 100
probability = 0.75
# Determine expected value
expected_value = pot * probability
print(expected_value)
75.0
Seu valor esperado é \$75. Valor esperado é um conceito importante no pôquer. Vamos voltar ao primeiro exemplo de flush para ver como usá-lo a seu favor.
Sua mão

Mão do oponente

Cartas comunitárias

-
Pote total = \$60
-
Aposta do oponente = \$20
Seu oponente, generosamente, mostra as cartas: uma trinca de 2. Para ganhar no river, você precisa acertar qualquer carta de Ouros exceto Valete ou 2. Valete ou 2 de Ouros dariam uma mão melhor ao oponente, um full house e uma quadra, respectivamente. Você precisa pagar \$20 para continuar na mão e, se vencer, leva \$60. Se seu valor esperado for maior que \$20, você deve pagar; se não, deve desistir.
Descubra se deve pagar:
# Sample Space
cards = 52
hole_cards = 2
# Your opponent provided you information... use it!
opponents_hole_cards = 2
turn_community_cards = 4
cards = cards - (hole_cards + opponents_hole_cards + turn_community_cards)
# Outcomes
diamonds = 13
diamonds_drawn = 4
# You can't count the two diamonds that won't help you win
diamond_non_outs = 2
outs = diamonds - diamonds_drawn - diamond_non_outs
# Determine win probability
win_probability = outs / cards
# Determine expected value
pot = 60
ev = pot * win_probability
# Print ev and appropriate decision
call_amount = 20
if ev >= 20:
print(round(ev, 2), 'Call')
else:
print(round(ev, 2), 'Fold')
9.55 Fold
Seu valor esperado é só \$9,55, menor que os \$20 que você precisaria arriscar para receber esse retorno, então deve desistir. Determinar o valor esperado é crucial na mesa, e a Parte 2 vai se aprofundar no conceito.
Conclusão
Parabéns, você chegou ao fim deste tutorial de teoria das probabilidades com Python! Esta é a Parte 1 do tutorial. Você viu vários conceitos centrais de probabilidade, incluindo eventos independentes/dependentes, permutações/combinações, múltiplos eventos, valores esperados e como calcular cada um.
Na Parte 2, você aplicará esses conceitos a mãos reais de pôquer que joguei na minha carreira.
*Antes do flop, turn e river, uma carta é queimada (virada para baixo). Como ninguém vê essa carta, ela não conta como uma tentativa.
Confira também o tutorial Probability Distributions in Python da DataCamp.
