ポーカーの役の出る確率をシミュレート

ポーカーのそれぞれの役の出る確率を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()

コメント

タイトルとURLをコピーしました