个性化阅读
专注于IT技术分析

使用Python的扑克概率和统计

本文概述

数据科学家创建机器学习模型以做出预测并优化决策。在在线扑克中, 选项是下注, 跟注或弃牌。但是, 不允许你使用软件来做出这些决定。那就是大多数在线扑克网站在规则中划清界限的地方。由于你不能训练机器学习模型, 因此必须训练你的大脑。这就需要远离扑克桌的无休止的资产计算流, 其使用许多不同的概率和统计概念。

在本教程中, 你将使用一副纸牌和一般扑克情况来学习其中的一些概念。更具体地说, 你将涵盖以下主题:

  • 概率论:导论
    • 关键概念
    • 计算概率
  • 组合和排列的概率
  • 独立事件与依存事件
  • 多个活动
    • 互斥活动
    • 非相互排斥的事件
    • 独立事件的交集
    • 相依事件的交集
  • 期望值
使用Python的扑克概率和统计1

如果你对使用Python处理统计数据感兴趣, 请考虑使用srcmini的Python统计思维课程。

个人动机

几年来, 我靠打职业在线扑克为生。数据科学对我来说是自然发展的过程, 因为它需要与从在线扑克中获利相似的技能。我写了一个博客, 介绍数据科学与扑克的共同点, 并且提到每次在在线扑克站点上玩扑克手时, 都会产生一手历史。这些手部历史解释了每个玩家在该手中所做的一切。我使用名为Hold’em Manager的软件(将Tableau用作扑克游戏)来利用这些数据。 Hold’em Manager将这些手部历史记录实时下载到PostgreSQL数据库中, 以便你可以跟踪对手的趋势。

概率论:导论

在弄脏手之前, 是时候考虑什么是概率论, 以及为什么在进入数据科学时学习它很重要。此外, 你还将学习一些在整个教程中都可以轻松考虑的关键概念, 并且还将学习如何计算单个事件的概率。

在现实生活中, 你常常会想知道某些事件发生的概率是多少, 例如中奖, 足球队的胜利或你最喜欢的鞋子打折。 “机会是什么……”是你可能经常使用的表达方式。确定事件发生的机会称为”概率”。

这种类型的概率不同于在概率论中数学的一种数学方法, 即数学中的概率论。在数学中, 你对”概率”的解释有两大类-“物理”概率和”证据”概率。

前者也称为目标概率或频率概率, 与随机的物理系统(例如掷硬币, 轮盘或掷骰子)相关联。在这样的系统中, 长期的试验中, 给定类型的事件倾向于以持续的速率或”相对频率”发生。

后者也称为贝叶斯概率, 即使在不涉及随机过程的情况下, 也可以分配给任何陈述, 以表示其主观合理性或可用证据支持陈述的程度。在大多数情况下, 证据概率被认为是置信度, 以在某些可能性下赌注的倾向来定义。

请注意, 概率论主要涉及预测未来事件的可能性, 而统计学则分析过去事件的发生频率。这也解释了为什么概率论也是想要成为数据科学家时应该涵盖的核心主题之一:众所周知, 在数据科学和机器学习中, 你将使用已经发生的事件中的数据预测未来事件。

因此, 虽然通常认为概率论很难直观地理解, 但这些概念对于数据科学和预测分析至关重要。

关键概念和符号

对于本教程, 你可能应该了解的一些关键概念主要是关于概率论的常识性观点, 因为本教程可使用52张扑克牌。

从这个角度来看, 概率论的基本要素是可以在基本相同的条件下(至少假设地)重复进行的实验。此实验可能会导致不同的试验结果或单个实验的结果不同。然后将所有可能的结果或实验结果的集合称为”样本空间”。事件是样本空间的明确定义的子集。

这都是非常理论上的。

让我们考虑一些示例:

  • 一个有点陈词滥调的例子就是掷硬币。实际上, 在这种情况下, 实验是掷硬币。你可以多次掷硬币, 所有这些试验可能会有不同的结果。由于存在两种可能的结果-正面或反面-样本空间为2。但是, “扔硬币”事件可以例如由一个结果”正面”组成。同样, 当你掷硬币两次时, 你的事件”第一次掷硬币会导致正面”, 其结果可能是”正面-正面”或”正面-尾巴”。
  • 另一个可能不太直接的例子是一个实验, 你旋转地球仪, 然后用手指将其停止。你可以多次旋转地球, 所有这些时间可能会产生不同的结果-你可以将手指放在陆地上或水上。这意味着样本空间为2。事件”我的手指在土地上”可能会产生”土地-水”或”土地-土地”的结果。
  • 最后一个例子是你掷骰子的实验。你可以多次掷骰子, 所有这些掷都可能有不同的结果:确切的说是6个, 因为骰子有6个数字(1, 2, 3, 4, 5, 6)。事件”两次掷出的结果之和等于10″可以包含10, 而事件”偶数”可以包含2、4或6。

现在, 你已经了解了本教程中将要使用的关键概念, 是时候考虑一​​下你还将遇到的一些概率符号了:

符号 含义
$$ \上限$$
$$ \ cup $$ Or
| 给定

计算单个事件的概率

现在你已经完全了解最新信息, 可以开始确定单个事件发生的概率, 例如硬币落在尾巴上。要计算此概率, 可以将可能的事件结果数除以样本空间。

这意味着你必须首先考虑硬币有多少种可能的方式落在尾巴上, 以及可能的结果数量。前者为1, 因为只有一种可能的方法来获得尾巴。后者为2, 因为当你掷硬币时, 你可能会遇到正面或反面。

总而言之, 事件A的概率的计算将如下所示:

$$ P(A)= \ frac {事件\结果\对\ A有利\}} {样本\空间} $$

在掷硬币的情况下, 硬币落在尾巴上的概率为1/2或0.5。

注意概率是如何始终在0和1之间, 其中0表示事件不太可能发生, 而1表示事件将很可能发生。

现在让我们考虑第二个示例, 在该示例中, 你将计算事件的概率。

使用Python的扑克概率和统计2

在标准纸牌中有52张纸牌, 在这52张纸牌中, 有4张是A。如果你遵循从上方掷硬币的示例来知道获得A的概率, 则将可能的事件结果数(4)除以样本空间(52):

$$ P(A)= \ frac {4} {52} $$

请注意$ A $如何表示”绘制A”事件。

现在, 借助Python确定绘制A的概率:

# 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的概率为0.08。要确定百分比形式的概率, 只需乘以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%

以百分比表示王牌的概率为8%。

现在, 你已经看到了两个计算概率的示例, 现在很容易假设你可以建立概率计算来确定, 例如, 得出一张印有”心形”牌, 一张面部牌(例如Jacks, Queens)的概率, 或国王), 或两者的结合, 例如红心皇后。

在这种情况下, 你可能想创建一个用户定义函数(UDF)event_probability(), 将event_outcomes和sample_space传递给该函数, 以百分比形式查找事件的可能性, 因为你将重用很多码:

# 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%

这些结果可能不会让你感到惊讶:正如你所期望的, 绘制红心皇后的机会比绘制普通脸部卡片或红心的机会小得多。

组合和排列的概率

在上一节中, 你已经知道确定样本空间的大小是计算概率的关键。但是, 有时可能会成为挑战!

幸运的是, 有许多方法可以简化计数任务。这些方式中的两种是排列和组合。在本节中, 你将看到这两个概念的确切含义以及如何使用它们来计算样本空间的大小!

排列

排列是可以从给定集合安排指定大小的子集的方式的数量, 通常无需替换。这样的一个例子是没有重复数字的4位PIN。可以通过执行以下计算来计算没有重复数字的概率:

$$ 10 \时间9 \时间8 \时间7 $$。

你有10个数字可供选择, 但是当你工作时不需替换时, 为4位数字引脚选择一个数字时, 一个选项总是会消失。这意味着在选择你的图钉的第一个数字时, 你将有10个数字可供选择(0到9), 但是对于你的图钉的第二个数字, 你将只有9个选项, 以此类推。

在更高的级别上, 你会看到上一段实际上考虑了两件事:(1)要选择的数字, 以及(2)你实际选择的数字。在上面的示例中, 当你考虑0到9之间的所有数字时, 可以选择10位数字。但是, 由于你有4位数字的图钉, 因此实际选择的位数是4。

计算排列时, 这意味着你要考虑要选择的全套数字, 实际上是$$ 10 \ times 9 \ times 8 \ times 7 \ times 6 \ times 5 \ times 4 \ times 3 \ times 2 \ times 1 $$, 然后将计算结果除以要选择的数字(10)和实际选择的数字(4)之差。因为你正在考虑概率, 所以这意味着差异将为$ 6 \ times 5 \ times 4 \ times 3 \ times 2 \ times 1 $$。

请注意, 你也可以将以上内容写为

$$ 10P4 = \ frac {10!} {(10-4)!} $$

你会注意到有一个” 10″!和” 6!”或等式中的” 10阶乘”和” 6阶乘”, 用于表示从1到10或包括10或6的所有连续正整数都将相乘。

此计算的结果是5040个排列。请注意, 当你乘以10、9、8和7时, 这与上面的计算完全相同。

概括以上计算, 这意味着计算置换的公式如下:

$$ nPk = \ frac {n!} {(n-k)!} $$

让我们用一个例子来练习!

要查找仅选择2的口袋A的排列数量, 你将考虑从(4)中选择的整套A, 然后还要考虑实际选择的A的数量(2):

$$ 4P2 = \ frac {4!} {(4-2)!} $$

组合方式

你已经看到, 在处理排列时, 顺序很重要。但是, 对于组合而言, 不是这种情况:顺序无关紧要。组合是指可以从给定集合中提取指定大小的子集的方式的数量。

在下面的示例中, 你有52张卡片组成的牌组。三张纸牌将从卡组中取出。你可以选择三种不同的方式?

实际上, 这应该是$ 52 \ x 51 \ x 50 $$, 这实际上与你刚刚使用的排列公式相同!但是, 使用组合时, 无需考虑订单。这意味着, 如果你想算出实际有多少个组合, 只需创建所有排列并除以所有冗余或$ 3 \ times 2 \ times $ 1 $。

这意味着你对组合的计算将如下所示:

$$ 52C3 = \ frac {\ frac {52!} {(52-3)!}} {3!} $$

该计算可以推广为以下公式:

$$ nCk = \ frac {nPk} {k!} $$

你清楚地看到分子与你刚刚看到的排列公式完全相同的公式, 而分母是你实际选择的牌数的阶乘。

考虑一下Aces的另一个例子。一副纸牌中有四个A, 这些都是口袋A的不同组合。

  1. 王牌之心/王牌钻石
  2. Ace Hearts / Ace俱乐部
  3. 王牌之心/王牌黑桃
  4. Ace钻石/ Ace俱乐部
  5. Ace钻石/ Ace黑桃
  6. Ace俱乐部/ Ace黑桃

口袋A有六种组合。要找到组合数量, 首先必须找到排列数量:

# Permutations Code
import math
n = 4
k = 2

# Determine permutations and print result
Permutations = math.factorial(n) / math.factorial(k)
print(Permutations)
12.0

要确定组合数量, 只需将排列数量除以子集大小的阶乘即可。尝试找出在德州扑克中可以处理的起始手组合数目。

$$ 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

独立事件与依存事件

你已在简介中读到, 事件是示例空间的定义明确的子集。事件可分为两类:相关或独立。

独立事件是不影响其他事件发生概率的事件。如果知道事件A是否发生没有给出有关事件B是否发生的信息, 则两个事件A和B是独立的。

例如, 当你从纸牌上抽出一张A, 更换卡片, 随机洗纸牌, 然后抽出另一张纸牌时, 这就是事实。第一次抽奖的概率与第二次抽奖的概率相同。

因此, 从属事件是对其他事件的概率有影响的事件。

例如, 你从卡组中抽出一张卡, 然后从卡组中抽出第二张卡而不更换第一张卡。在这种情况下, 第一手绘制A的概率与第二次绘制A的概率不同。在抽出第一张纸牌后, 样本空间从52减少到51, 减少了1。根据第一张纸牌上的内容, 事件结果的数量也可能已更改。如果该卡是A, 那么第二次抽奖中只剩下3个A。

现在让我们以正式术语考虑这些定义。事件A和B(具有非零概率)是独立的, 并且仅当以下等效语句之一成立时:$$ P(A∩B)= P(A)P(B)$$ $$ P(A | B )= P(A)$$ $$ P(B | A)= P(B)$$

换句话说, 如果满足以下条件, 则事件A和事件B是独立的:

  • 事件A和B发生的概率等于每个事件发生的概率的乘积。
  • 如果事件B已经发生, 则事件A发生的概率等于事件A发生的概率。
  • 如果事件A已经发生, 则事件B发生的概率与事件B发生的概率相同。

让我们考虑下面的示例, 在该示例中, 你已经知道在第一个平局上绘制A的可能性。现在, 如果第一张纸牌是国王或A牌, 则需要确定在第二张纸牌上画A的概率:

# 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

扑克中有一些常见的情况与依存事件的概念有关。

但是在开始之前, 需要准备一些背景信息。游戏是德州扑克。在标准的52张纸牌中, 德州扑克是所有扑克游戏中最受欢迎的一种。每位玩家都会发两张牌开始游戏, 并通过将两张牌与整个手牌中的五张公共牌相结合, 来做出最好的五张牌。卡分四轮发:

  • 翻牌前:每位玩家被发两张牌, 称为”底牌”
  • 翻牌圈:发了三张社区卡
  • 转牌:发一张社区卡
  • 河:发放了最终的社区卡

相关事件:抽奖

你的手

使用Python的扑克概率和统计3

社区卡

使用Python的扑克概率和统计4

在转牌圈, 你有4张牌进入A高位同花顺。同花顺是一张很强的扑克手, 其中所有五张牌都是相同的花色。最后一个社区卡(称为River Card)是钻石的概率是多少?

# 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

大约有20%的机会在河牌圈抽水。这是另一个:

相关事件:不限名额平局

你的手

使用Python的扑克概率和统计5

社区卡

使用Python的扑克概率和统计6

在转牌圈, 你可以进行无限制的顺子抽奖。直牌是另一只强牌, 其中有五张牌依次出现。顺子平局是开放式的, 因为任何八(8、9、10, 杰克, 女王)或任何国王(9、10, 杰克, 女王, 国王)都将完成顺子。

河牌完成直道的几率是多少?

# 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

大约有17%的机会在河牌圈中直接下注。

多个活动

到现在为止, 你在计算概率时只考虑了一个事件, 但是在处理多个事件时会考虑什么呢?

多个事件的一个例子是问题”当你从装有这两种类型的饼干的饼干罐中吃了四个饼干时, 先吃三个燕麦饼干然后再吃巧克力饼干的概率是多少?”吃四个饼干实际上是四个事件。

要计算多个事件的概率, 你基本上可以确定事件的数量(在这种情况下为4), 然后确定每个事件分别发生的概率, 然后将所有这些概率相乘得出最终答案。在上述示例中, 该值为0.5 x 0.5 x 0.5 x 0.5或0.0625。

$$ P(事件A \ cap事件B)= P(事件A)\时间P(事件A)$$

请注意, 在这种情况下, 你要计算食用燕麦饼干, 另一个燕麦饼干, 第三燕麦片和最后一块巧克力饼干的概率。当你考虑所有必须发生的事件时, 你需要乘以概率。

对于你的一副扑克牌, 你可以问自己一个问题:”选择不更换时获得三颗心的概率是多少?”。当你采样或选择不更换时, 这意味着你选择了一张卡, 但不要放回去, 因此最终选择不能包括该卡。在这种情况下, 你的概率计算将为:13/52 x 12/51 x 11/50。

互斥活动

当你处理多个事件时, 你可能还会遇到相互排斥或不相交的事件:它们不能同时发生。在这种情况下, 你可能想要计算发生的多个互斥事件中任何一个的概率(或并集)。在这种情况下, 你无需乘以概率, 而只需将每个事件发生的概率相加即可:

$$ P(事件A \ cup事件B)= P(事件A)+ P(事件B)$$

了解” OR”部分非常重要, 这是关键:吸引人或吸引俱乐部是两个相互排斥的事件。心是心, 俱乐部是俱乐部。要确定绘制心脏或绘制球杆的概率, 请将绘制心脏的概率添加到绘制球杆的概率。

$$ P(心脏\ cup俱乐部)=(\ frac {13} {52})+(\ frac {13} {52})$$

现在是时候确定以下相互排斥的事件的可能性了;

  1. 吸引人或吸引俱乐部;
  2. 绘制一张王牌, 国王或王后。
# 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

非相互排斥的事件

你可以想象并非所有事件都是互斥的:画心或画王牌是两个互不排斥的事件。心的王牌既是王牌又是心。如果事件不是互斥的, 则必须纠正重叠。

$$ P(事件A \ cup事件B)= P(事件A)+ P(事件B)-P(事件A \ cup事件B)$$

要计算绘制心脏或ace的概率, 请将绘制心脏的概率与绘制ace的概率相加, 然后减去绘制心脏的ace的概率。

$$ P(心脏\ cup Ace)=(\ frac {13} {52})+(\ frac {4} {52})-(\ frac {1} {52})$$

计算以下非互斥事件的概率;

  1. 画一颗心或一张王牌;
  2. 绘制红牌或面部卡。
# 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

独立事件的交集

通过将每个事件发生的概率相乘来确定两个独立事件相交的概率。

$$ P(事件A \ cap事件B)= P(事件A)\时间P(事件B)$$

如果你想知道从一副纸牌中抽出一张A的概率, 将其替换, 重新洗牌并重新绘制另一张A的可能性, 则可以将抽出的概率乘以A并乘以A的概率。

$$ 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的概率为0.592%。如果第二个事件是依赖的怎么办?

相依事件的交集

两个非独立事件(给定A的事件A和事件B)相交的概率是通过将事件A发生的概率乘以给定A的事件B的概率来确定的。

$$ P(事件A \ cap事件B | A)= P(事件A)\时间P(事件B | A)$$

在德州扑克中, 最好的起手牌是口袋A。被发两张A的概率是多少?

$$ 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的概率为0.452%。让我们看一下在扑克桌上发挥作用的几种情况。

相依事件的相交:同花顺同花

你的手

使用Python的扑克概率和统计7

社区卡

使用Python的扑克概率和统计8

这与上面的同花顺子抽奖类似, 只是这次你在翻牌圈有另外两张公共牌, 而不是一张。你如何确定在河边冲水的可能性?首先, 你需要确定所有可能的方案;

  • A)转钻石, 河非钻石(冲水)
  • B)转非钻石, 河钻石(冲水)
  • C)转钻石, 河钻石(同花顺)
  • D)转非钻石, 河非钻石(无冲洗)

这些是仅有的四种可能性, 并且每种情况都是互斥的。这意味着, 如果将每种情况的概率相加, 则总数为1。换句话说, 这四种情况肯定会发生。你想知道场景A, B或C发生的可能性。解决此问题的最简单方法是确定方案D的概率, 并从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

现在让我们稍微换一下手:

你的手

使用Python的扑克概率和统计9

社区卡

使用Python的扑克概率和统计10

除了一个很大的不同之外, 这与最后一个相似。你仍然有同花听牌, 但是这次你没有Ace。如果钻石在转弯处和河牌圈落下, 则很有可能有人会获得更好的同花。确定钻石掉落在转弯处或河边的概率, 但不能同时确定两者。你已经有可能不刷新。

现在找到钻石掉落在转弯处和河边的概率, 将其加到未击中同花顺的概率上, 然后减去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

期望值

在玩诸如扑克之类的游戏时, 你会非常担心诸如”如果我反复玩此游戏, 我平均会获利多少?”之类的问题。你可以想象, 这对扑克并没有什么不同, 特别是当你是职业扑克玩家时!

现在, 如果可以用随机变量描述游戏的可能结果及其相关概率, 那么你可以通过计算其期望值来回答上述问题, 该期望值等于每个结果的权重平均值乘以它的概率。

换句话说, 你只需将”总价值”乘以获胜的概率即可获得”期望价值”:

$$预期值=总值\倍概率$$

如果底池中有\ $ 100(总值), 而你赢得底池的概率为0.75, 则期望值为多少?

$$期望值= \ $ 100 \倍0.75 $$

# Initialize `pot` and `probability` variables
pot = 100
probability = 0.75

# Determine expected value
expected_value = pot * probability
print(expected_value)
75.0

你的预期价值是\ $ 75。期望值是扑克中的一个重要概念。让我们回到第一个冲洗示例, 看看如何利用期望值来发挥自己的优势。

你的手
使用Python的扑克概率和统计11
对手之手
使用Python的扑克概率和统计12
社区卡
使用Python的扑克概率和统计13
  • 总底池= \ $ 60
  • 对手下注= \ $ 20

你的对手决定提供帮助, 并向你显示他的牌, 并且有2分。要在河牌圈中获胜, 你必须击中除Jack或2之外的任何钻石。Jack或2 Diamonds将给你的对手更好的一手牌, 分别是满满的一手牌和四张相同的牌。你必须叫出\ $ 20来保持一手牌, 如果你赢了这手牌, 则赢了\ $ 60。如果你的期望值大于\ $ 20, 你应该下注, 否则, 你应该弃牌。

弄清楚你是否应该下注:

# 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

你的期望值仅为\ $ 9.55, 低于要获得该奖励所需要冒险的\ $ 20, 因此你必须弃牌。确定期望值是在扑克桌上理解的关键, 第2部分将对该概念进行更深入的研究。

总结

恭喜, 你已经完成了使用Python进行概率论的本教程!本教程的第1部分到此结束。你了解了几个核心概率概念, 包括独立/从属事件, 排列/组合, 多个事件, 期望值, 以及如何计算它们。

在第2部分中, 你将把这些概念应用于我在职业生涯中玩过的实际扑克游戏。

*在翻牌, 转牌和河牌之前, 一张牌面朝下发出, 称为加深牌。由于该卡面朝下发出, 并且没有玩家知道它是什么, 因此不算作试用。

赞(0)
未经允许不得转载:srcmini » 使用Python的扑克概率和统计

评论 抢沙发

评论前必须登录!