プリフロップでプレイヤーの手札を固定した場合の勝率を求めてみました。
コードのベースは以下の記事を参考ください。
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. おわりに
こういったプリフロップの勝率は多くのサイトに記載されていますが、自分でコードを書くと色々試せて面白いですね。
よろしければ皆さんも是非試してみてください。