Khóa học
Các nhà khoa học dữ liệu xây dựng mô hình machine learning để đưa ra dự đoán và tối ưu quyết định. Trong poker trực tuyến, các lựa chọn là cược, theo, hoặc bỏ. Tuy nhiên, bạn không được phép dùng phần mềm để đưa ra những quyết định đó. Đa số các trang poker trực tuyến đều đặt giới hạn ở quy tắc này. Vì bạn không thể huấn luyện một mô hình machine learning, bạn phải “huấn luyện bộ não” của mình. Điều này đòi hỏi một dòng chảy bất tận các phép tính equity ngoài bàn poker, vốn sử dụng nhiều khái niệm về xác suất và thống kê.
Trong hướng dẫn này, bạn sẽ học một số khái niệm đó bằng cách dùng một bộ bài và các tình huống poker tổng quát.

Nếu bạn quan tâm đến việc chinh phục thống kê bằng Python, hãy cân nhắc khóa học Statistical Thinking in Python của DataCamp.
Động lực cá nhân
Trong vài năm, tôi kiếm sống bằng việc chơi poker trực tuyến chuyên nghiệp. Khoa học dữ liệu là bước chuyển tự nhiên với tôi vì nó đòi hỏi bộ kỹ năng tương tự việc kiếm lợi nhuận từ poker trực tuyến. Tôi đã viết một bài blog về những điểm chung giữa khoa học dữ liệu và poker, và tôi có đề cập rằng mỗi khi một ván bài được chơi trên một trang poker trực tuyến, một “lịch sử ván bài” sẽ được tạo. Những bản ghi này mô tả mọi hành động của từng người chơi trong ván. Tôi đã dùng phần mềm có tên Hold’em Manager (hãy nghĩ như Tableau cho poker) để tận dụng dữ liệu này. Hold'em Manager tải về từng lịch sử ván bài theo thời gian thực vào cơ sở dữ liệu PostgreSQL để bạn có thể theo dõi xu hướng của đối thủ.
Lý thuyết xác suất: Mở đầu
Trước khi bắt tay vào thực hành, hãy xem xét lý thuyết xác suất là gì và vì sao cần học khi bạn bước vào khoa học dữ liệu. Ngoài ra, bạn sẽ học một số khái niệm then chốt hữu ích xuyên suốt hướng dẫn này và cách tính xác suất của các biến cố đơn.
Trong đời thực, bạn thường tự hỏi xác suất xảy ra của một sự kiện nào đó là bao nhiêu, như trúng số, đội bóng của bạn chiến thắng, hay có giảm giá cho đôi giày yêu thích. “Khả năng là bao nhiêu…” có lẽ là câu bạn dùng khá thường xuyên. Việc xác định khả năng một sự kiện xảy ra được gọi là “xác suất”.
Kiểu xác suất này khác với cách nhìn toán học về xác suất trong lý thuyết xác suất, một nhánh của toán học. Trong toán học, có hai phạm trù diễn giải rộng về “xác suất” — “xác suất vật lý” và “xác suất bằng chứng”.
Loại thứ nhất còn gọi là khách quan hay tần suất, gắn với các hệ thống vật lý ngẫu nhiên như tung đồng xu, bánh xe roulette, hay xúc xắc. Trong các hệ này, một loại sự kiện nhất định có xu hướng xảy ra với một tần suất tương đối ổn định trong chuỗi thử nghiệm dài.
Loại sau còn gọi là xác suất Bayes, có thể gán cho bất kỳ mệnh đề nào, ngay cả khi không có quá trình ngẫu nhiên, như một cách biểu đạt độ hợp lý chủ quan, hay mức độ mà mệnh đề đó được bằng chứng hiện có ủng hộ. Theo đa số cách hiểu, xác suất bằng chứng được xem là mức độ niềm tin, được xác định qua xu hướng đặt cược ở một tỷ lệ nhất định.
Lưu ý rằng lý thuyết xác suất chủ yếu quan tâm đến dự đoán khả năng xảy ra của các sự kiện tương lai, trong khi thống kê phân tích tần suất của các sự kiện đã qua. Điều này cũng lý giải vì sao lý thuyết xác suất là chủ đề cốt lõi bạn nên nắm nếu muốn trở thành nhà khoa học dữ liệu: như bạn đã biết, trong khoa học dữ liệu và machine learning, bạn dùng dữ liệu của các sự kiện đã xảy ra để dự đoán các sự kiện tương lai.
Vì vậy dù lý thuyết xác suất thường được xem là khó nắm bắt trực giác, các khái niệm của nó lại tối quan trọng đối với khoa học dữ liệu và phân tích dự đoán.
Các khái niệm và ký hiệu chính
Một số khái niệm then chốt bạn nên biết cho hướng dẫn này chủ yếu thuộc góc nhìn tần suất về xác suất, vì chúng ta làm việc với một bộ 52 quân bài.
Từ góc nhìn đó, thành phần cơ bản của lý thuyết xác suất là một thí nghiệm có thể lặp lại, ít nhất là về mặt giả định, trong các điều kiện gần như giống nhau. Thí nghiệm này có thể dẫn đến các kết cục khác nhau ở các lần thử hay lần thực hiện đơn của thí nghiệm. Tập hợp tất cả các kết cục hay kết quả có thể của một thí nghiệm được gọi là “không gian mẫu”. Một sự kiện là một tập con xác định rõ của không gian mẫu.
Tất cả những điều này còn khá lý thuyết.
Hãy xét vài ví dụ:
- Một ví dụ có phần sáo mòn là tung đồng xu. Ở đây, thí nghiệm chính là việc tung đồng xu. Bạn có thể tung nhiều lần, và mỗi lần có thể có kết cục khác nhau. Vì có hai kết cục có thể — sấp hoặc ngửa — không gian mẫu là 2. Tuy nhiên, sự kiện “tung đồng xu” có thể gồm một kết cục “Ngửa”. Tương tự, khi bạn tung hai lần, sự kiện “lần tung đầu ra Ngửa” có thể có kết cục “Ngửa-Ngửa” hoặc “Ngửa-Sấp”.
- Một ví dụ khác ít hiển nhiên hơn là xoay quả địa cầu và dừng bằng cách đặt ngón tay lên. Bạn có thể xoay nhiều lần và mỗi lần có thể có kết cục khác nhau — Ngón tay bạn có thể chạm đất liền hoặc biển. Nghĩa là không gian mẫu là 2. Sự kiện “ngón tay ở trên đất liền” có thể có kết cục “Đất liền - Biển” hoặc “Đất liền - Đất liền”.
- Ví dụ cuối là tung một con xúc xắc. Bạn có thể tung nhiều lần và mỗi lần có kết cục khác nhau: chính xác là 6, vì xúc xắc có 6 mặt số (1,2,3,4,5,6). Sự kiện “Tổng của hai lần tung bằng 10” có thể gồm 10, trong khi sự kiện “số chẵn” có thể gồm 2, 4, hoặc 6.
Giờ khi bạn đã nắm ý về các khái niệm sẽ dùng xuyên suốt, cũng là lúc xem qua một số ký hiệu xác suất mà bạn sẽ gặp:
| Ký hiệu | Ý nghĩa |
|---|---|
| $$\cap$$ | Và |
| $$\cup$$ | Hoặc |
| | | Với điều kiện |
Tính xác suất cho biến cố đơn
Bây giờ bạn đã sẵn sàng, hãy bắt đầu xác định xác suất một biến cố đơn xảy ra, như đồng xu rơi vào mặt sấp. Để tính xác suất này, bạn chia số lượng kết cục dẫn đến biến cố cho kích thước không gian mẫu.
Tức là bạn cần xem có bao nhiêu cách để đồng xu rơi vào sấp, và tổng số kết cục có thể. Cái đầu là 1, vì chỉ có một cách để ra sấp. Cái sau là 2, vì khi tung đồng xu, bạn sẽ ra ngửa hoặc sấp.
Tóm lại, phép tính xác suất của một biến cố A sẽ như sau:
$$P(A) = \frac{Event \ outcomes \ favorable \ to \ A}{Sample \ space}$$
Trong ví dụ tung đồng xu, xác suất ra sấp là 1/2 hay 0,5.
Lưu ý rằng xác suất luôn nằm giữa 0 và 1, trong đó 0 chỉ ra rằng sự kiện khó xảy ra, còn 1 chỉ ra rằng sự kiện chắc chắn xảy ra.
Giờ hãy xét ví dụ thứ hai trong đó bạn sẽ tính xác suất của một biến cố.

Một bộ bài chuẩn có 52 lá và trong số đó có 4 lá Át. Nếu theo ví dụ tung đồng xu ở trên để biết xác suất rút được một lá Át, bạn sẽ chia số kết cục dẫn đến biến cố (4) cho không gian mẫu (52):
$$P(A) = \frac{4}{52}$$
Lưu ý $A$ biểu thị biến cố “rút được một lá Át”.
Giờ hãy xác định xác suất rút được một lá Át với sự trợ giúp của 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
Xác suất rút được một lá Át từ bộ bài chuẩn là 0,08. Để đổi xác suất sang phần trăm, chỉ cần nhân với 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%
Xác suất rút được một lá Át tính theo phần trăm là 8%.
Sau khi đã thấy hai ví dụ tính xác suất, dễ hiểu nếu bạn muốn mở rộng các phép tính để xác định, chẳng hạn, xác suất rút được một lá cơ (Hearts), một lá hình (face card như J, Q, K), hoặc kết hợp cả hai như Q cơ.
Trong những trường hợp như vậy, bạn có thể muốn tạo một Hàm do người dùng định nghĩa (UDF) event_probability() nhận event_outcomes và sample_space để tìm xác suất của một biến cố dưới dạng phần trăm, vì bạn sẽ tái sử dụng khá nhiều mã:
# 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%
Các kết quả này có lẽ không khiến bạn bất ngờ: như dự đoán, cơ hội rút được Q cơ nhỏ hơn nhiều so với rút một lá hình nói chung hay một lá cơ bất kỳ.
Xác suất với Chỉnh hợp và Tổ hợp
Ở phần trước bạn đã thấy việc xác định kích thước không gian mẫu là chìa khóa để tính xác suất. Tuy vậy, việc đếm này đôi khi có thể là thách thức!
May mắn thay, có những cách giúp việc đếm dễ hơn. Hai cách trong số đó là chỉnh hợp và tổ hợp. Trong phần này, bạn sẽ thấy chính xác hai khái niệm này nghĩa là gì và cách dùng chúng để tính kích thước không gian mẫu!
Chỉnh hợp (Permutations)
Chỉnh hợp là số cách sắp xếp một tập con có kích thước xác định được chọn từ một tập cho trước, thường là không hoàn lại. Ví dụ là mã PIN 4 chữ số không lặp chữ số. Xác suất không có chữ số lặp có thể tính bằng phép tính sau:
$$10 \times 9 \times 8 \times 7$$.
Bạn có 10 số để chọn, nhưng vì không hoàn lại, mỗi lần chọn cho mã 4 chữ số sẽ bớt đi một lựa chọn. Nghĩa là khi chọn chữ số đầu tiên, bạn có 10 số (0 đến 9), đến chữ số thứ hai chỉ còn 9 lựa chọn, v.v.
Ở mức trừu tượng hơn, đoạn trên thực ra xét hai điều: (1) số lượng để chọn, và (2) số lượng bạn thực sự chọn. Ở ví dụ trên, 10 là số chữ số bạn có thể chọn (0 đến 9). Tuy nhiên, số lượng bạn thực sự chọn là 4, vì mã có 4 chữ số.
Khi tính chỉnh hợp, bạn xét toàn bộ tập số để chọn, tức $$10 \times 9 \times 8 \times 7 \times 6 \times 5 \times 4 \times 3 \times 2 \times 1$$ và chia kết quả này cho phần chênh lệch giữa số lượng để chọn (10) và số lượng thực sự chọn (4). Vì đang xét xác suất, phần chênh này sẽ là $$6 \times 5 \times 4 \times 3 \times 2 \times 1$$.
Lưu ý bạn cũng có thể viết như sau
$$10P4 = \frac{10!}{(10 - 4)!}$$
Bạn sẽ thấy có “10!” và “6!” hay “10 giai thừa” và “6 giai thừa” trong công thức, dùng để chỉ rằng tất cả các số nguyên dương liên tiếp từ 1 đến 10 hoặc 6 được nhân với nhau.
Kết quả phép tính này là 5040 chỉnh hợp. Lưu ý điều này đúng chính xác như phép tính ở trên khi bạn nhân 10, 9, 8 và 7.
Khái quát, công thức tính chỉnh hợp là:
$$nPk = \frac{n!}{(n - k)!}$$
Hãy luyện tập với một ví dụ!
Để tìm số chỉnh hợp của cặp Át tẩy (pocket Aces), trong đó bạn chỉ chọn 2, bạn xét toàn bộ số lá Át có thể chọn (4) và số lá bạn thực sự chọn (2):
$$4P2 = \frac{4!}{(4 - 2)!}$$
Tổ hợp (Combinations)
Bạn đã thấy với chỉnh hợp, thứ tự có ý nghĩa. Với tổ hợp thì không: thứ tự không quan trọng. Tổ hợp là số cách rút một tập con có kích thước xác định từ một tập cho trước.
Ví dụ: bạn có bộ bài gồm 52 lá. Sẽ rút ra 3 lá. Có bao nhiêu cách khác nhau để chọn 3 lá này?
Thực ra, điều này sẽ là $$52 \times 51 \times 50$$, vốn giống công thức chỉnh hợp bạn vừa dùng! Tuy nhiên, với tổ hợp, bạn không tính đến thứ tự. Nghĩa là nếu muốn biết có bao nhiêu tổ hợp thực sự, bạn chỉ việc tạo tất cả các chỉnh hợp và chia cho số hoán vị dư thừa, tức $$3 \times 2 \times 1$$.
Điều đó có nghĩa phép tính tổ hợp của bạn sẽ như sau:
$$52C3 = \frac{\frac {52!}{(52-3)!}}{3!}$$
Phép tính này có thể khái quát thành công thức:
$$nCk = \frac{nPk}{k!}$$
Ở đây bạn thấy rõ tử số chính là công thức chỉnh hợp vừa thấy, còn mẫu số là giai thừa của số lá bạn thực sự chọn.
Xét thêm ví dụ với lá Át. Có bốn lá Át trong bộ bài, và đây là tất cả các tổ hợp cặp Át tẩy;
- Át Cơ / Át Rô
- Át Cơ / Át Nhép
- Át Cơ / Át Bích
- Át Rô / Át Nhép
- Át Rô / Át Bích
- Át Nhép / Át Bích
Có sáu tổ hợp cặp Át tẩy. Để tìm số tổ hợp, trước hết bạn phải tìm số chỉnh hợp:
# Permutations Code
import math
n = 4
k = 2
# Determine permutations and print result
Permutations = math.factorial(n) / math.factorial(k)
print(Permutations)
12.0
Để xác định số tổ hợp, chỉ cần chia số chỉnh hợp cho giai thừa của kích thước tập con. Hãy thử tìm số tổ hợp tay khởi đầu có thể chia trong 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
Biến cố độc lập và phụ thuộc
Bạn đã đọc ở phần mở đầu rằng một biến cố là một tập con xác định rõ của không gian mẫu. Biến cố có thể được phân loại thành hai nhóm: phụ thuộc hoặc độc lập.
Các biến cố độc lập là những biến cố không ảnh hưởng đến xác suất của biến cố khác. Hai biến cố A và B độc lập nếu biết A có xảy ra hay không không cho ta thông tin gì về việc B có xảy ra hay không.
Điều này đúng khi, ví dụ, bạn rút một lá Át khỏi bộ bài, đặt lại lá bài, xáo bài, rồi rút một lá khác. Xác suất rút Át ở lần đầu giống với lần thứ hai.
Các biến cố phụ thuộc là những biến cố có ảnh hưởng đến xác suất của biến cố khác.
Ví dụ, bạn rút một lá từ bộ bài rồi rút lá thứ hai mà không đặt lại lá đầu. Khi đó, xác suất rút một lá Át ở lần đầu không giống xác suất rút Át ở lần thứ hai. Sau lần rút đầu, không gian mẫu giảm đi 1, từ 52 còn 51. Tùy vào lá bài rút ở lần đầu, số kết cục có thể của biến cố cũng có thể thay đổi. Nếu lá đầu là Át, thì chỉ còn 3 lá Át cho lần rút thứ hai.
Giờ hãy xét các định nghĩa này theo ngôn ngữ hình thức. Các biến cố A và B (có xác suất khác 0) là độc lập khi và chỉ khi một trong các mệnh đề tương đương sau đúng: $$P (A ∩ B) = P(A)P(B)$$ $$P (A|B) = P(A)$$ $$P (B|A) = P(B)$$
Nói cách khác, A và B độc lập nếu:
- Xác suất A và B cùng xảy ra bằng tích các xác suất của từng biến cố.
- Xác suất A xảy ra khi B đã xảy ra bằng xác suất A xảy ra.
- Xác suất B xảy ra khi A đã xảy ra bằng xác suất B xảy ra.
Xét ví dụ sau, bạn đã biết xác suất rút được Át ở lần rút đầu. Giờ bạn cần xác định xác suất rút được Át ở lần thứ hai, nếu lá đầu tiên là K hoặc Át:
# 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
Có vài tình huống thường gặp trong poker liên quan đến khái niệm biến cố phụ thuộc.
Trước khi bắt đầu, cần một chút bối cảnh. Trò chơi là Texas Hold’em. Chơi với một bộ 52 lá chuẩn, Texas Hold’em là biến thể poker phổ biến nhất. Mỗi người chơi được chia hai lá khi bắt đầu ván và sẽ tạo ra tay 5 lá tốt nhất bằng cách kết hợp hai lá của mình với năm lá chung được chia trong suốt ván. Bài được chia qua bốn vòng:
- Pre-Flop: Mỗi người chơi được chia hai lá, gọi là “hole cards”
- Flop: Chia ba lá chung
- Turn: Chia một lá chung
- River: Lá chung cuối cùng được chia
Biến cố phụ thuộc: Kèo thùng (Flush draw)
Bài của bạn

Bài chung

Bạn đang ở vòng Turn và có bốn lá để tạo Thùng Át cao. Thùng là một tay mạnh khi cả năm lá cùng một chất. Xác suất lá bài chung cuối cùng, gọi là River, là Rô (Diamond) là bao nhiêu?
# 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
Có khoảng 20% cơ hội bạn hoàn thành kèo Thùng ở River. Thêm một ví dụ nữa:
Biến cố phụ thuộc: Kèo sảnh hai đầu (Open-Ended Straight Draw)
Bài của bạn

Bài chung

Bạn đang ở vòng Turn và có kèo sảnh hai đầu. Sảnh là một tay mạnh khác với năm lá liên tiếp. Kèo sảnh “mở hai đầu” vì bất kỳ lá Tám (8, 9, 10, J, Q) hoặc bất kỳ lá K (9, 10, J, Q, K) đều hoàn thành sảnh.
Xác suất lá River hoàn thành sảnh là bao nhiêu?
# 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
Có khoảng 17% cơ hội bạn hoàn thành kèo Sảnh ở River.
Nhiều biến cố
Đến giờ, bạn mới xét một biến cố khi tính xác suất, nhưng nếu bạn xử lý nhiều biến cố thì sao?
Một ví dụ về nhiều biến cố là câu hỏi “xác suất ăn ba chiếc bánh yến mạch rồi sau đó một chiếc bánh chocolate khi bạn ăn bốn chiếc từ một hũ bánh gồm hai loại này là bao nhiêu?” Ăn bốn chiếc thực chất là bốn biến cố.
Để tính xác suất cho nhiều biến cố, về cơ bản bạn xác định số biến cố (4 trong trường hợp này), rồi xác định xác suất cho từng biến cố riêng lẻ và nhân tất cả các xác suất này để được đáp án cuối. Trong ví dụ trên, sẽ là 0,5 x 0,5 x 0,5 x 0,5 hay 0,0625.
$$P(Event A \cap Event B)=P(Event A) \times P(Event A)$$
Lưu ý rằng ở đây bạn tính xác suất ăn một chiếc bánh yến mạch VÀ một chiếc yến mạch khác VÀ chiếc thứ ba là yến mạch, VÀ chiếc cuối là chocolate. Khi bạn xét các biến cố đều phải xảy ra, bạn nhân các xác suất.
Với bộ bài, bạn có thể hỏi “Xác suất rút được ba lá cơ khi chọn mà không hoàn lại là bao nhiêu?”. Khi chọn không hoàn lại, tức là bạn rút một lá nhưng không trả lại, nên tập lựa chọn cuối không thể gồm lá đó nữa. Trong trường hợp này, phép tính xác suất sẽ là 13/52 x 12/51 x 11/50.
Biến cố loại trừ nhau
Khi làm việc với nhiều biến cố, bạn cũng có thể có các biến cố loại trừ nhau: chúng không thể cùng xảy ra. Trong những trường hợp như vậy, bạn có thể muốn tính xác suất (hay hợp) của bất kỳ trong số các biến cố loại trừ nhau xảy ra. Khi đó, bạn không nhân mà cộng xác suất của từng biến cố:
$$P(Event A \cup Event B) = P(Event A) + P(Event B)$$
Điểm mấu chốt ở đây là yếu tố “HOẶC” rất quan trọng: rút một lá cơ HOẶC rút một lá nhép là hai biến cố loại trừ nhau. Cơ là cơ và nhép là nhép. Để xác định xác suất rút lá cơ hoặc lá nhép, hãy cộng xác suất rút cơ với xác suất rút nhép.
$$P(Heart \cup Club) = (\frac{13}{52}) + (\frac{13}{52})$$
Giờ là lúc bạn xác định xác suất cho các biến cố loại trừ nhau sau;
- Rút lá cơ hoặc rút lá nhép;
- Rút lá Át, K, hoặc Q.
# 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
Biến cố không loại trừ nhau
Bạn có thể hình dung không phải mọi biến cố đều loại trừ nhau: Rút một lá cơ hoặc rút một lá Át là hai biến cố không loại trừ nhau. Át cơ vừa là Át vừa là cơ. Khi các biến cố không loại trừ nhau, bạn phải điều chỉnh phần giao nhau.
$$P(Event A \cup Event B) = P(Event A) + P(Event B) - P(EventA \cup EventB)$$
Để tính xác suất rút lá cơ hoặc lá Át, cộng xác suất rút cơ với xác suất rút Át rồi trừ đi xác suất rút Át cơ.
$$P(Heart \cup Ace) = (\frac{13}{52}) + (\frac{4}{52}) - (\frac{1}{52})$$
Hãy tính xác suất cho các biến cố không loại trừ nhau sau;
- Rút lá cơ hoặc lá Át;
- Rút lá đỏ hoặc rút lá hình.
# 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
Giao của các biến cố độc lập
Xác suất giao của hai biến cố độc lập được xác định bằng cách nhân xác suất của từng biến cố.
$$P(Event A \cap Event B) = P(Event A) \times P(Event B)$$
Nếu bạn muốn biết xác suất rút một lá Át từ bộ bài, đặt lại, xáo bài, rồi rút thêm một lá Át nữa, bạn nhân xác suất rút Át với xác suất rút Át.
$$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
Xác suất rút hai lá Át liên tiếp, độc lập, là 0,592%. Nếu biến cố thứ hai phụ thuộc thì sao?
Giao của các biến cố phụ thuộc
Xác suất giao của hai biến cố không độc lập (Biến cố A & Biến cố B với điều kiện A) được xác định bằng cách nhân xác suất Biến cố A xảy ra với xác suất Biến cố B xảy ra khi đã biết A.
$$P(Event A \cap Event B | A) = P(Event A) \times P(Event B | A)$$
Tay khởi đầu tốt nhất bạn có thể có trong Texas Hold’em là cặp Át tẩy. Xác suất được chia hai lá Át là bao nhiêu?
$$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
Xác suất rút hai lá Át phụ thuộc liên tiếp là 0,452%. Hãy xem một vài tình huống trên bàn poker nơi điều này có liên quan.
Giao của biến cố phụ thuộc: Kèo thùng ở Flop
Bài của bạn

Bài chung

Tình huống này giống kèo Thùng ở trên, chỉ khác là lần này bạn đang ở flop và còn hai lá chung nữa thay vì chỉ một. Làm sao xác định xác suất có Thùng ở River? Trước hết bạn cần liệt kê các kịch bản có thể;
- A) Turn là Rô, River không phải Rô (Hoàn thành Thùng)
- B) Turn không phải Rô, River là Rô (Hoàn thành Thùng)
- C) Turn là Rô, River là Rô (Hoàn thành Thùng)
- D) Turn không phải Rô, River không phải Rô (Không có Thùng)
Chỉ có bốn khả năng đó, và mỗi kịch bản loại trừ nhau. Nghĩa là nếu cộng xác suất của từng kịch bản, tổng sẽ bằng 1. Nói cách khác, một trong bốn kịch bản chắc chắn xảy ra. Bạn muốn biết xác suất A, B, hoặc C xảy ra. Cách đơn giản nhất là xác định xác suất kịch bản D rồi trừ khỏi 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
Giờ hãy thay đổi bài một chút:
Bài của bạn

Bài chung

Tình huống này tương tự, ngoại trừ một khác biệt lớn. Bạn vẫn có kèo thùng, nhưng lần này bạn không có Át. Nếu rơi Rô ở turn và river, có khả năng ai đó sẽ có kèo thùng mạnh hơn. Hãy xác định xác suất có Rô ở Turn hoặc River, nhưng không phải cả hai. Bạn đã có xác suất không trúng thùng.
Giờ hãy tìm xác suất có Rô ở cả turn và river, cộng với xác suất không trúng thùng, rồi trừ khỏi 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
Giá trị kỳ vọng
Khi chơi trò như poker, bạn khá quan tâm đến câu hỏi “trung bình tôi được — hay mất — bao nhiêu nếu lặp lại trò này?”. Bạn có thể hình dung điều này càng đúng với poker, nhất là khi bạn là người chơi chuyên nghiệp!
Nếu các kết cục có thể của trò chơi và xác suất tương ứng có thể được mô tả bởi một biến ngẫu nhiên, bạn có thể trả lời câu hỏi trên bằng cách tính giá trị kỳ vọng, bằng với trung bình có trọng số của các kết cục, trong đó mỗi kết cục được trọng số theo xác suất của nó.
Nói cách khác, bạn chỉ cần nhân Tổng giá trị với xác suất thắng để có Giá trị kỳ vọng:
$$Expected Value = Total Value \times Probability$$
Giá trị kỳ vọng là bao nhiêu nếu có \$100 (Tổng giá trị) trong pot, và xác suất bạn thắng pot là 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
Giá trị kỳ vọng của bạn là \$75. Giá trị kỳ vọng là khái niệm quan trọng trong poker. Hãy quay lại ví dụ kèo thùng đầu tiên để xem cách dùng giá trị kỳ vọng có lợi cho bạn.
Bài của bạn

Bài của đối thủ

Bài chung

-
Tổng pot = \$60
-
Đối thủ cược = \$20
Đối thủ của bạn đã “tốt bụng” mở bài, và có bộ ba 2. Để thắng ở River, bạn phải trúng bất kỳ lá Rô nào trừ J hoặc 2. Lá J hoặc 2 Rô sẽ cho đối thủ tay mạnh hơn, lần lượt là cù lũ và tứ quý. Bạn phải theo \$20 để tiếp tục, và nếu thắng bạn nhận \$60. Nếu giá trị kỳ vọng lớn hơn \$20 bạn nên theo, nếu không thì nên bỏ.
Hãy xác định bạn có nên theo cược không:
# 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
Giá trị kỳ vọng của bạn chỉ \$9,55, thấp hơn \$20 bạn cần mạo hiểm để lấy phần thưởng đó, nên bạn phải bỏ. Xác định Giá trị kỳ vọng là kỹ năng then chốt cần hiểu trên bàn poker và Phần 2 sẽ đi sâu hơn nhiều vào khái niệm này.
Kết luận
Chúc mừng, bạn đã đi đến cuối hướng dẫn về lý thuyết xác suất với Python! Đây là phần kết của Phần 1. Bạn đã học về nhiều khái niệm xác suất cốt lõi gồm biến cố độc lập/phụ thuộc, chỉnh hợp/tổ hợp, nhiều biến cố, giá trị kỳ vọng, và cách tính từng khái niệm.
Ở Phần 2, bạn sẽ áp dụng các khái niệm này vào những ván bài poker thực tế mà tôi đã chơi trong sự nghiệp.
*Trước Flop, Turn, và River, một lá được chia úp xuống, gọi là lá “Burn”. Vì lá này úp xuống và không ai biết là gì, nó không được tính là một lần thử.
Xem thêm hướng dẫn Phân phối xác suất trong Python của DataCamp.