ポーカーのそれぞれの役の出る確率をPythonで求めてみました。
シミュレーションと理論値
理論値はポーカーの確率にあります。
シミュレーションと理論値を比較してみました。
役 | シミュレーション | 理論値 |
---|---|---|
Royal Flush | 6 | 4 |
Straight Flush | 25 | 36 |
Four of a Kind | 635 | 624 |
Full House | 3812 | 3744 |
Flush | 5065 | 5108 |
Straight | 9214 | 10200 |
Three of a Kind | 54573 | 54912 |
Two Pair | 123856 | 123552 |
One Pair | 1099113 | 1098240 |
High Card | 1302661 | 1302540 |
全体 | 2598960 | 2598960 |
コード
import random
def main():
results = {}
for i in range(2598960):
cards = make_cards()
cards = random.sample(cards, 5)
result = poker_hand(cards)
if result in results:
results[result] += 1
else:
results[result] = 1
print(results)
def poker_hand(cards):
ranks_all = ["A", "K", "Q", "J", "T", "9", "8", "7", "6", "5", "4", "3", "2"]
ranks = [14 - ranks_all.index(card[0]) for card in cards]
suits = [card[1] for card in cards]
rank_counts = [ranks.count(rank) for rank in set(ranks)]
if 14 in ranks and 13 in ranks and 12 in ranks and 11 in ranks and 10 in ranks:
if len(set(suits)) == 1:
return "Royal Flush"
if len(set(ranks)) == 5 and max(ranks) - min(ranks) == 4:
if len(set(suits)) == 1:
return "Straight Flush"
if 4 in rank_counts:
return "Four of a Kind"
if 3 in rank_counts and 2 in rank_counts:
return "Full House"
if len(set(suits)) == 1:
return "Flush"
if max(ranks) - min(ranks) == 4 and len(set(ranks)) == 5:
return "Straight"
if 3 in rank_counts:
return "Three of a Kind"
if rank_counts.count(2) == 2:
return "Two Pair"
if 2 in rank_counts:
return "One Pair"
return "High Card"
def make_cards():
ranks = ["A", "K", "Q", "J", "T", "9", "8", "7", "6", "5", "4", "3", "2"]
suits = ["S", "H", "D", "C"]
cards = []
for suit in suits:
for rank in ranks:
cards.append([rank, suit])
return cards
if __name__ == "__main__":
main()
def main():
results = {}
for i in range(2598960):
cards = make_cards()
cards = random.sample(cards, 5)
result = poker_hand(cards)
if result in results:
results[result] += 1
else:
results[result] = 1
print(results)
def poker_hand(cards):
ranks_all = ["A", "K", "Q", "J", "T", "9", "8", "7", "6", "5", "4", "3", "2"]
ranks = [14 - ranks_all.index(card[0]) for card in cards]
suits = [card[1] for card in cards]
rank_counts = [ranks.count(rank) for rank in set(ranks)]
if 14 in ranks and 13 in ranks and 12 in ranks and 11 in ranks and 10 in ranks:
if len(set(suits)) == 1:
return "Royal Flush"
if len(set(ranks)) == 5 and max(ranks) - min(ranks) == 4:
if len(set(suits)) == 1:
return "Straight Flush"
if 4 in rank_counts:
return "Four of a Kind"
if 3 in rank_counts and 2 in rank_counts:
return "Full House"
if len(set(suits)) == 1:
return "Flush"
if max(ranks) - min(ranks) == 4 and len(set(ranks)) == 5:
return "Straight"
if 3 in rank_counts:
return "Three of a Kind"
if rank_counts.count(2) == 2:
return "Two Pair"
if 2 in rank_counts:
return "One Pair"
return "High Card"
def make_cards():
ranks = ["A", "K", "Q", "J", "T", "9", "8", "7", "6", "5", "4", "3", "2"]
suits = ["S", "H", "D", "C"]
cards = []
for suit in suits:
for rank in ranks:
cards.append([rank, suit])
return cards
if __name__ == "__main__":
main()
コメント