DB/R/統計/データサイエンス/投資話についてつらつらと

世のため自分のためのアウトプット

Poker Python

プリフロップハンド毎の勝率 VSランダムハンド (pythonでシミュレーション2)

投稿日:

プリフロップでプレイヤーの手札を固定した場合の勝率を求めてみました。
コードのベースは以下の記事を参考ください。

pythonでテキサスホールデムのシミュレーション1

また、コードは以下のgithubに配置しています。ハンドを固定するサンプルコードはsample3になります。

https://github.com/T-A0K1/texas_holdem_python

1. 特定ハンドVSランダムハンド(ヘッズアップ)

色々なサイトでも掲載されていますが、たしなみとして算出してみます。
※あくまで1万回のシミュレーション結果のため、必ずしも正確な数値でないことはご了承ください。

有名所のハンドでは以下のような結果になりました。
よく27oが一番弱いと言われますが、ヘッズアップにかぎれば23oの方が弱いですね。

ハンド 勝率 負率 引分 勝率(除ドロー)
23o 29.35% 64.45% 6.20% 31.29%
27o 31.88% 62.36% 5.76% 33.83%
Tjo 53.89% 43.23% 2.88% 55.49%
ATo 61.22% 36.54% 2.24% 62.62%
AKo 64.13% 34.10% 1.77% 65.29%
23s 33.12% 61.28% 5.61% 35.08%
27s 35.24% 59.42% 5.33% 37.23%
TJs 56.28% 41.13% 2.59% 57.78%
ATs 63.24% 34.50% 2.26% 64.70%
AKs 65.97% 32.44% 1.59% 67.04%
22 49.63% 48.41% 1.96% 50.62%
99 71.32% 27.88% 0.80% 71.89%
TT 74.61% 24.59% 0.80% 75.21%
KK 82.18% 17.20% 0.63% 82.70%
AA 84.95% 14.56% 0.49% 85.37%

コードでは、以下のようにプレイヤー0のハンドを固定し、そのカードを事前に山札から抜きます。

また、プレイヤー1のハンドはランダムハンドにしています。

hand0 = [141,142] #set player0's hand
for pref_ in hand0:
    library_card.remove(pref_)
hand1 = [library_card.pop(0) for _ in range(2)]

2. 特定ハンドVSランダムハンド(3プレイヤー以上)

続いて、複数プレイヤーを想定した場合の勝率です。
ここで、複数プレイヤーが勝って引き分けた場合は1/n勝としてカウントしています。

こちらも特徴的なハンドのみピックアップしています(プレイヤー数は3,4,6,9人)。

TJsと99の比較で、6プレイヤーまでは99のほうが勝率が高いですが、9プレイヤーではTJsが僅かですが上回っています。
これは、多人数では99ではスリーカード以上にならないと殆ど勝てない一方で、TJsはストレートやフラッシュができやすいためと思われます。

あとは、やはりプレイヤー数が増えると27oが勝率が悪くなるのが分かります。
流石に9人いたら、7のペアとかではまず勝てませんからね。

ハンド 3 4 6 9
23o 20.05% 14.19% 9.02% 6.10%
27o 20.42% 14.45% 8.85% 5.40%
TJo 39.12% 30.79% 21.65% 14.75%
AKo 48.56% 38.99% 28.40% 19.37%
23s 23.91% 18.06% 12.96% 9.77%
TJs 41.93% 34.30% 24.91% 17.81%
AKs 50.93% 41.61% 31.45% 23.20%
22 30.84% 21.85% 15.35% 12.25%
99 53.73% 41.48% 26.53% 17.40%
KK 68.43% 58.28% 43.18% 29.13%
AA 73.34% 64.06% 49.12% 34.78%

コードでは、以下でプレイヤー数を増やすことができます。

hand0 = [131,132] #set player0's hand
hand1 = [library_card.pop(0) for _ in range(2)]
hand2 = [library_card.pop(0) for _ in range(2)]

kekka0 = judge_hand(hand0+field_card) # player0
kekka1 = judge_hand(hand1+field_card) # player1
kekka2 = judge_hand(hand2+field_card) # player2

tmp_result = judge_game([kekka0, kekka1, kekka2, kekka3])

さらに、3人以上になると二人以上が引き分けで勝利するに対応するため結果の集計時には以下のようにn人の引き分けの場合は、1/n勝としています。
※judge_game()の戻り値は勝利プレイヤーのリスト
例:[2,3] プレイヤー2と3が同じ役で勝利。

for p_ in tmp_result:
    win_player_dic[p_] += 1/(len(tmp_result))

3. おわりに

こういったプリフロップの勝率は多くのサイトに記載されていますが、自分でコードを書くと色々試せて面白いですね。

よろしければ皆さんも是非試してみてください。

-Poker, Python
-, ,

Copyright© 世のため自分のためのアウトプット , 2020 All Rights Reserved Powered by STINGER.