このブログ内を検索可能

2024年7月12日金曜日

テキサスホールデムの確率(10) ゲームの流れ

 テキサスホールデムのゲームをプレイしたのだが、何回やってもどういうルールなのかがさっぱりわからない。毎フェーズ賭けるプレイヤーが変わるうえ、全掛けすると急にディーラー側に5枚一気に配られるのでルールがまったくわからずシミュレーションのしようがない。

そしてなんか適当にやっていたら一瞬で全チップ消えた。

なのでまずこのゲームがどういう流れで進行するかを知らなければならない。

そういうわけで現在ゲームの学習中である。

2024年7月11日木曜日

テキサスホールデムの確率(10) 勝率計算

相手の平均的な役の確率分布が分かれば勝率が判明する。

相手の役の確率分布を{0,0,0,0,0,0,0,…,1(ワンペア数字3柄2),2(ワンペア数字3柄3),2(ワンペア数字3柄4),1(ワンペア数字4柄1),0,0,0…}と仮定した場合、

自分のカード7組の最大役がワンペア数字3柄3であった場合、「勝ち」となるのは相手がワンペア数字3柄2まですなわち1通りであり、勝率は全体の1+2+2+1=6に対して1なので1/6。

もし自身の現在のカードが6枚ならば、ここから1枚が提示されてこの7組になる確率は1/46でありその勝率は1/6である。結局1/(46*6)=1/276となる。

そしてその6枚のカードは他にも45通り存在し、それらに対して勝率が計算される。その和をとったものは期待値の定義になり、すなわちペイアウト率が判明する。

ただし重複を避けるために最初に結果の7組から、さかのぼって到達可能なパターンを判別し順次加算するため、各2~6組にたいしての並立作業は行えない。

かかる時間としては、7組は133784560通りあり、その各通りに対して7C2+7C5+7C6+7C7=21+21+7+1=50パターンの勝率判定があるので、67億回くらい大小の判定をしなければならない。よってその判定はとにかく簡略化する必要がある。

判定方法としては自身の役の強さ未満の確率分布の総和/確率分布を出すために行った試行回数で求められる。しかしこれは途方もない時間がかかることが予想されるのでいったん試行回数を650000回程度で止めてみた確率分布を採用してみる。

最初の2枚のカードのものでまず計算すると、100000回で32秒かかる。これを133784560通りやるので32*1337ということで40000秒くらいかかる。これは650分に相当し1日足らずで出来る。これは時間がかからず現実的である。

これが分かれば最初2枚時点での勝率がおおまかにわかるので、まず標準の確率分布をしっかりと計算させる。

7C2通りに対して加算処理を行うのが11時間程度なので、

7C5通りに対しても同じく11時間程度。

7C6通りに対しては7/21倍が期待されるので4時間程度。

7C7通りについてはそのまま勝率を用いることができる。

ただし7枚の組に関しては格納すべきリストの量が1億少々になるのでエクセルなどに保存できなさそうでそこをどうするかが課題。

一応下の結果は【ポーカーの確率表】テキサスホールデムポーカーの役の確率や勝率を解説 (pokerguild.jp)に記されているが、この数値が本当かどうかをチェックする。

例えば柄1のAと柄1の5ならば柄が一致しているのでsuitedであり、この表を見ると60%であるが、我の52C2通りのリストでそれに似た数値を得られているかをチェックする。ただし答え合わせまでは時間がかかる。
これがおおむねあっていると分かれば5,6,7枚の組に対しても勝率があっていることがおそらく保証されるので、いよいよ実用化可能。5~7枚の組に関して全データが載っているサイトはおそらくなく、有料レベルである。
正直ポーカーのプログラムとテキサスホールデムの仕様は知り始めてまだ1週間かそこらなので専門用語はほぼ何も知らない。
とりあえずルールに則って厳密な確率を求めることはできるが時間がかかることと、簡易バージョンの作成ができる程度である。そしてそれは先行データにはかけた時間の関係上勝てないがとりあえずカジプロでどれくらい通用するかが気になる。

途中経過として{2500000,{{1,1},{1,3},{1,6},{1,7},{2,6},{2,9},{4,9}},136,0.682751,136,{0.500769,0.151746,0.104533,0.10521,0.0651906,0.0656041,0.0633125,0.0636142,0.0645725,0.0649154,0.0652869,0.0656869,0.0869254,0.0650688,0.0549903,0.0551082,0.0555999,0.0505558,0.0510104,0.05118,0.051496,0.0526326,0.0529934,0.0533849,0.0538071,0.087283,0.0652069,0.0549194,0.0550502,0.0555457,0.050558,0.051025,0.0511983,0.0515161,0.0526592,0.0530217,0.0534151,0.0538389,0.0883532,0.0656368,0.0550524,0.0551591,0.0556651,0.0506536,0.0511237,0.0513004,0.0516234,0.0527719,0.0531412,0.0535426,0.0539735,0.0544433,0.0547887,0.0551341,0.0525799,0.0529617,0.0533603,0.0536252,0.0545335,0.0548358,0.0551643,0.0555193,0.0753445,0.0571774,0.0460347,0.0464242,0.0468182,0.0436464,0.0440715,0.0445159,0.0447856,0.0458574,0.0461668,0.0465039,0.0468689,0.0758109,0.0573871,0.0460522,0.0464423,0.0468424,0.0436676,0.0440928,0.044538,0.0448089,0.0458817,0.0461926,0.0465314,0.0468979,0.0767469,0.0578123,0.0461243,0.0465163,0.0469245,0.0437526,0.0441804,0.0446292,0.0449048,0.0459827,0.0462998,0.0466459}}という結果を得た。
これは{{1,1},{1,2}}というカードの組はもはやこれ以降は出現しないため第1要素のみ計算が完了していることを意味するが勝率は50.1%となっている。だが実際の確率は57%であり、そこそこ異なる。やはりその2枚を除いたもので計算していなかったため誤差がでたものと考えられる。
いずれにせよ、7%も差ができてしまうとこれだけ時間をかけてもあまり有効とは言えないので、自身の役の強さから勝負に出る確率を遺伝的に計算するプログラムへとシフトする。
具体的にはノーペアに対して全掛けする遺伝子は短命であるが、適切にBETを調整する遺伝子は生き残る。ランダムに役毎にどれくらいBETするかの遺伝子を構成し、それ同士で戦わせる。そして相手のBETに応じてBETを変えたりする遺伝子も導入してみたいと思っているが、まずは簡単バージョンでそれを入れないものでやってみたい。

理想としてはそれによって世代を経て成熟していった遺伝子が、ランダムなものに対して非常に高い勝率を維持し続けることである。
この操作は上記のように時間もかからないので、やってみる価値はある。それが無理ならルーレットなどの「偏り」を利用した作戦に出るかもしれない(プレイしていると放出期と回収機の差が激しいため何らかの法則あるいは傾向があるのではないかと考えた)

テキサスホールデムの確率(9) 途中経過(2)

{3130000,{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,78,593,0,31,701,5191,0,75,2693,19871,0,306,7563,56048,0,661,17323,131581,0,1295}}

上はノーペアの強弱判定でまず大小判定をする数字とは別に、5枚の中で最大の柄で役を分けたもので、下はおそらくルール通りにその数字内での柄での強弱判定に切り替えたもの。

 {100000,{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,3,8,5,36,28,42,45,203,180,163,181,524,521,488,539,1207,1206,1157,1191,2411,2487}}

これによると29番目すなわちノーペアで数字9の場合の最弱柄の出現率が大幅に上がっているのが分かる。1つ目の解釈では5枚の中で最大の数値をとっていたので、{1,2,3,4}の柄からランダムに5つピックアップすると当たり前ながら最大値が4となる確率は大きくなる。2つ目の解釈ではその7という数字での柄を見ているので最大値はそもそも候補がただ1つなので、29~32番目は均等に出るはずで、実際まだ試行回数が少ないがまあそれなりにその傾向は出ている。

今度こそちゃんと標準の確率分布が出るはずなので待つ。これがある程度データがそろえば、いよいよすべての7組のカードに対して役をこれと比較し勝率をただちに計算でき、その7組に至る2~6組の各フェーズでのカードからの到達率を計算し(例えば5組ならあと2枚で成立するので1/47C2)勝率を加算していき期待値としてその和をとればよい。

これを行えばついに近似値ではあるが各フェーズでの自身のカードおよびディーラーの札での勝率が分かることになりひと段落する。

そうなれば後はBET額のやりとりのみが指標となるので、この指標をどのように設定したCPUが生き残っていくのかいろんなパターン(遺伝子)に対してバトルさせるがやったことないのでうまく行くかは不明。少なくとも勝率が出ればかなり有利の可能性。

なお10000回で1.5分ほどかかっているのでサンプル1000万回は1500分すなわち25時間かかる。明日の朝には計算を中断してそれをサンプルに用いる予定。

なぜか通常勝てないはずのカジプロで数十億チップもっているのがVIPではやたらといるのが不思議ではあるが、ただ課金するだけではそこまでいけないはず。おそらく何かで稼いでいることは確かで、特にRMT業者はテキサスホールデムで稼いでいるはずなので、ここに何か方法があるはず。我レベルのプログラミングができる者が通常のプレイヤーの中に大量にいるとは考えづらいが、業者はおそらく相当賢いものと思われる。

一応我も業者であるが、プログラムの考案、作成、実施、販売すべてを行っているので組織ではない。エミュレータとは非常に便利なものである。小4からすでにそれで何ができるかを知っており野望があったのである。

テキサスホールデムの確率(8) 途中経過

 手持ちのカードに関する条件なしのベースとなる確率分布の計算が進行中である。

現時点では夜通し回していたので3130000回試行できており、そのサンプルをとると

{3130000,{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,78,593,0,31,701,5191,0,75,2693,19871,0,306,7563,56048,0,661,17323,131581,0,1295}}

となっている。これは役を低いものから50個ほど抽出しているもので、最初の方にゼロが多いのはノーペアで弱い柄になることは起こらないことを意味している。この場合29番目まではほぼ起こらないということであるが、ノーペアでは最大の数字が優先される強さとなっているので、まず最大が2(最弱)となるのはどの柄1~4でも起こらない。これが2,3,4,5,6,7,8までは一度も起こっていないのは、たとえば8であっても9以上の数字が7枚のどこにも表れないというのは(7/13)^7であり、最大が8だとするならばまず他のカードが8の時点でワンペアなので7以下確定。そして次は6以下確定…となると8,7,6,5,4,3,2の構成しかありえなくなるがこれはストレート以上を構築する。よってワンペア以上が確定で出る(鳩の巣原理)ので、理論上テキサスホールデムでノーペアの8以下は出ない。9ならば柄の弱いものから順に0,4,7,593と出てくるが最弱の柄がでないのは一応理論上{1,2},{1,3},{1,4},{1,5},{1,7},{1,8},{1,9}などの場合にありうるが、極めて低い確率なので出ないだけ。ノーペアでは数字ついで柄を強さの順としているが今回のシミュレーションではその数字内の柄で強さを競うのかそうでないのかが不明なので(例として{1,2},{1,3},{1,4},{3,5},{1,7}と{1,2},{1,3},{1,4},{2,5},{2,7}の比較では前者はと後者は最大7で同じ、柄の比較は組での最大ならそれぞれ3と2、7という数字内なら1と2なので結果が異なる)とりあえず柄の最大値としているがどちらにしてもそこまで確率は変わってこない気がするのでここはスルー(いちいち計算をやり直すとまた1日かかるので)…としたかったがノーペアKの確率が131581/3130000と案外無視できない結果になったのでやり直す。

2024年7月10日水曜日

テキサスホールデムの確率(7) 処理回数の最適化

 同じパターンに対して役を計算するのは面倒なので、判明している2~7枚のカードの組になる確率をすべての2~7枚のパターンに対して順次計算していく方式に切り替える。

何を言っているのかわからないと思うし自分でも何を書いているかわからないので具体例を提示する。

例えば{{1,1},{1,2},{1,3},{1,4},{1,5},{1,6},{1,7}}の組があるとすると、すでにこのカードの組で形成される最高役は定義済み(柄1のストレートフラッシュ数字7)。

そしてこのカードを形成しうる初期パターンは、最初の2枚提示段階ではこの集合から2つの要素を持つ部分集合で{1,1},{1,2}から{1,6},{1,7}が該当し、残り5枚がこれになるのは50枚から5枚が選ばれる確率なので1/50C5になり、

最初の2枚+3枚提示では5つの要素を持つ部分集合で7C5通りでそれらがこの結果に行きつく確率は1/47C2となる

これをすべての52C7通りについて実行すればよい。

そうすると全フェーズにおいて確率を求めることができ、おそらく処理時間もましになるはず。

そのためには{1,1},{1,2}をID=1とし、{4,12},{4,13}をID=52C2とするような変換が必要だがこれは二項係数を多項式で計算させておいたほうがはやいのでそれでいく。

なお、それぞれのカードの組に対して各役の確率を示す配列を作ろうとすると、例えば7枚判明していたら52C7個の要素に関して考え得るすべての役448個となるのでデータの個数は59935482880個となり、600億個にも膨れ上がる。

こうなるとPCのメモリがある程度良性能でも厳しいので、各要素に代入あるいは加算するのは勝率にしなければならない。

しかしながら、勝率を計算するためには現在の7枚の組に対して残り45枚から7枚を選ばせる必要があり、この7組はすべて出現確率が等しいのだがそれらすべてに対して役を判定していると、45379620通り計算しなければならず、それをこちらのパターン分すなわち133784560通りに対して行うので6071092494667200通り(6071兆通り)になり、一生終わらない見込み。

よってここでは各7枚の組を持つカードに対して、相手の7枚の確率分布はこちらの手が分からないとする場合の7枚として一律に扱うこととする。

ただおそらくその操作もすさまじく時間がかかる。何しろそれぞれのカードに対して最大の役の判定(7枚中5枚を使うので21通り)を行うからである。ここではノーペアとワンペアなどのそれぞれのパターンの生成率は、最大の役をとるという制約上同様に確からしくないので逐一計算が必要になる。

順序としてはメモリの関係上先にこちらの計算が必要であり、もし何十日もかかりそうならランダム生成数十万回程度で計算する。

→30秒で1000回。133784560回なので133784*30でおよそ4000000秒。すなわち65000分となり、1100時間。およそ40~50日に相当するので、前のビンゴバルーンの例と比較するとまあ待てない機関ではないが、そもそもそれを求めたところでその確率分布が厳密な数値として活きる場合がない。というのも52枚から7枚を相手が選んでことに対して、自身の見えている手が0枚ということはありえないからである。(初期から2枚オープン)

しかしこれはいろんな状態に対して近似値を与えるのでこのパターンを用いているに過ぎない。…がそもそも近似値ならばそこで厳密値を求める価値はほぼない。よってランダムにして回数をある程度増やすことにする。

およそ1日くらいで終了させたいので、1分で2000回、1時間で120000回、1日で2880000回。明日の昼くらいにはいい感じになってほしく、途中で中断することもできるので一応10000000回に設定してみる。

この結果が出れば、すべての自身のパターン2,5,6,7組のカードに対してこれと役の強さを比較し勝率を各パターンに順次代入、加算していく。

なおカジプロは明日ついにVIPとなる。自分で増やせないうちはやはりRMTというのは非常に良いものである。1日30000円収入が入ると仮定すれば5000万チップ3000円なので毎日5億チップは手に入る。


どうでもいい話だが、7月9日にクレーンゲーマー(tiktokなどを駆使し昨年くらいから登録者数千人から急に100万人を記録したクレーンゲーム系youtuber。すでにもっかいちゃんねるやKTGを超え、いよいよTOPであるつるなかに迫る勢い。我もクレーンをするが登録者は数百人の雑魚である。彼らは我の1000倍はすごいということである)である「だぶるあっぷ」氏がトップラン東大阪の一番奥にあるトリプルキャッチャーメガダッシュの筐体でカービィ(むてきキャンディ)をGETしている動画があった。

そして千日前線でそれと同じカービィだけを袋に入れずに抱えて持っている客を同日に見かけた。まさか…?

いやしかしトップランから千日前線に乗っているのは不自然で、通常ならバスで若江岩田に行くか長田or新石切方面に抜けるはずで、前者ならその動きはありえない。とすると中央線経由で谷町4で乗り換えたのか…?

いずれにせよ信憑性はないがぬいぐるみを素でかかえてしかも同日に同じ景品というのはなかなか珍しいものである。ただトップラン東大阪はあの筐体から帰る途中右側に大きな袋が置かれているので素で持って帰るのも珍しい。

我もぬいぐるみを素で持って帰るのは最近では岩手の万SAI堂北上でかばんに直接ぶちこんだときくらい。直近の遠征先でのぬいぐるみは広島新井口のアルパーク北棟のカービィであるがあれは袋に入れた。

なお生駒山上の動画もあがっており、あの風船の動画だけで隣が入り口かつ特徴のあるぼろい床であの場所ということが瞬時に分かった。うつっているエアホッケーややっていたスマートボールは我もちょっと前プレイした。

特にだぶるあっぷ氏はトップラン東大阪でのプレイ動画が多く(拾円遊戯場、バケツ回転設定が特異的で前者はアイビス太子、ままんまるしぇ高鍋、縁日堂とここくらいしか該当せず、バケツ回転設定はアイビス太子とここだけの特徴的な設定。うーさんが考案しているのだが我はうーさんに会ったことがある。しかしながらビッグクリアフィギュアをめぐって敗北したが)プレイ場所を同定できる動画がいくつか存在する。

ちなみにトップラン東大阪は以前はかなり取れた印象だが最近は取れにくくなったのでほとんど行っていない。あとあそこの問題点は、景品の入荷が結構遅れるというところ…。レトロ感が出ていて雰囲気はいいのだが…。

2024年7月9日火曜日

テキサスホールデムの確率(7) 現在のカードから勝率を計算

 すでに手持ちとディーラーカードを合算したカードでどれが最高役になるかは判定できたので、次に相手のカードは分からないので、各フェーズにおいてディーラーのカードからの相手の役の確率分布を知りたいところ。

しかしそれを知ろうとすると、途方もない時間がかかってしまう。およそ計算に30日かかる見込みであるが、そこまで厳密な値は知れなくても良いので適当に100000回くらいやったものをサンプルとして利用しようと思う。

同様に、カード枚数が少なくパターンが多すぎる場合は適当に試行を途中でうちきって勝率をチェックする。

それにより、それぞれのフェーズで勝率を計算しようと思っていた…のだが、ランダムに100回実行するだけでも十数秒かかるため制限時間内でどうにかなるものではない。

そのため、都度確率を計算するには数が足りないのであらかじめ計算しておく必要がある。

よって最初のカード2枚(+ディーラー側5枚)に対して各役の成立確率を計算する必要がある。

とはいうものの、最初の2枚が与えられても残りは50C5通りと非常に総数が多く、現時点で1000パターンに十数秒(1秒50パターン程度)かかるのである2枚の組に対して2118760パターンしらべるので、それだけで数時間かかる見込み。そしてそれが52C2=1326通りあるのでとてもではないが計算しきれない。なのであらかじめ計算するといってもそこでもやはり10000回くらいで打ち切らざるを得ない。

全パターンでおよそ1日くらいで出来上がってほしいので86400秒、すなわち4320000パターン探索可能なのでそれを1326で割るとだいたい3000回試行ができそうである。

その後のフェーズでは最初の2+3枚が与えられるのだが、ここでもやはり同じパターンで計算を行う必要がある。

はたして3000回の試行で勝率をそれなりに把握することができるのか。

スーパーコンピューターでも使えるのならば一気に総当たりで確率を算出してそれをデータとして保存し利用できるが…。

このあたりは計算リソースの限界なので、これ以上はどうしようもない。

一応2+4枚まで来ると各パターンは46通りなのでランダムは必要なく

2+3枚で各パターンは47C2=47*23=1081なのでここでも厳密な値は求められる。

なので最初の2枚だけはおおざっぱな確率、以後は厳密な確率を求めることができる。

…のだが、その場合各パターンが膨れ上がるので総当たりは厳しい。

具体的には2+3枚時点で2809475760回、2+4枚時点で936491920回、2+5時点で133784560回なので、一番簡単なものでもすさまじく時間がかかる。

するとやはり都度計算が必要になる。

この点で最適解を構築することが非常に難しい。

テキサスホールデムの確率(6) カードの組をIDに変換する

 {{1,1},{1,2},{1,3},{1,4},{1,5}}をID1とし、{{4,9},{4,10},{4,11},{4,12},{4,13}}をID52C5とするようなプログラムを作りたい。

まずは{1,1}から{4,13}を1次元の数に変換した方が都合よさそうなのでこれは{2,6}ならば{1,13}まで13個、{2,1}から6個なので19番目という例を利用すれば、

13*((第1要素)-1)+(第2要素)=13*(第1要素)+(第②要素)-13で与えられる。

すると{1,2,3,4,5}をID1,{48,49,50,51,52}をID52C5=2598960とする問題に変わる。

まず1つ目の値が2となるのは、{1,2,3,4,5}から{1,49,50,51,52}までの総数であるがこれは{2,3,4,5}から{49,50,51,52}までの2~52の51個の数字を4つ選ぶ組み合わせに相当するので51C4通りである。その51という数字は2~52由来、またその2は第1要素であるから、以後要素をそれぞれq,b,c,d,eと置き換えるとa~52由来なので52-a+1C4=53-aC4となる。

例えば{4,5,6,7,8}ならば1スタートは{1,2,3,4,5}から{1,49,50,51,52}の52-2+1C4通り、{2,3,4,5,6}から{2,49,50,51,52}の50C4通り…と{3,49,50,51,52}まで51C4+50C4+49C4通りが存在することになるのでSUMを用いてSUM(i=2,a,53-iC4)となる。

つづいて{4,7,8,9,10}はここまでの{4,6,50,51,52}までのどれだけのパターンがあるかを考える。第2要素bは7であるが、5,6,7,8から5,50,51,52までは52-5+1C4通り存在する。これを6についても同様に行うのでSUMの開始は5(=a+1)で始まり6(=b-1)で終わる。

具体的には{4,5,6,7,8}から{4,5,50,51,52}の6~52の3つ選びで47C3通り、{4,6,7,8,9}から{4,6,50,51,52}の7~52の3つ並びで46C3通りがある。

すなわちSUM(i=a+2,b,53-iC3)(=i=a+1,b-1,52-iC3)となる。以後同様に繰り返せばよい。

実際30000番目は{{1, 1}, {1, 3}, {2, 2}, {3, 3}, {4, 12}}であるが、これを先ほどの関数に代入すれば30000となり逆関数が成立する。

ここまでSUMで式を表したが、Combinationにおいては変数を使っても多項式で表すことができるので先に計算すると

1/120 (31212504 a - 1249250 a^2 + 24995 a^3 - 250 a^4 + a^5 - 

   5 (-514898 b + 15299 b^2 - 202 b^3 + b^4 - 

      4 (-1765218 + 7802 c - 153 c^2 + c^3 + 309 d - 3 d^2 + 6 e)))という多項式で表すことができる。なのでこの辺りは普通に高校範囲。京大あたりの入試問題に出ててもおかしくなさそう。

これにより先ほどの7組のカードから最大の役を判定するプログラムは一瞬でできるようになったので、次は各フェーズにおける最大の役の確率分布を計算する段階へと入る。

(1000回試行で16秒程度)

テキサスホールデムの確率(5) 確率計算簡略化

これまではポーカーの各カードの組の確率を求めたが、よく考えればテキサスホールデムではその確率は変わってくることに気づいたので、改めて一部プログラムを変更して考える。

手元にカードが2枚ありそれを{{1,1},{1,2}}のペアであったとすると残りディーラ札5枚の組み合わせすなわち{{1,3},{1,4},{1,5},{1,6},{1,7}}から{{4,9},{4,10},{4,11},{4,12},{4,13}}の52C5通りが存在し、そのそれぞれに対して作れうる最大の役を取得しなければならない。

そして2+5枚から5枚を選ぶのは7C5=21通りあり、そのそれぞれに対して役の最大値を計算すればよい。

例えば{{1,3},{1,4},{1,5},{1,6},{1,7}}の場合、最大の役はストレートフラッシュであり{{4,9},{4,10},{4,11},{4,12},{4,13}}の場合もそうである。

この情報を役リスト(すべての強さにかかわる役と数字、柄のリスト)に格納する。

役リストは最弱の{0(ノーペア),2(数字の最弱),1(柄の最弱)}から始まり{9(ロイヤルストレートフラッシュ),14(固定),4(柄の最強)}まで存在する。

{{1,1},{1,2}}と{{1,3},{1,4},{1,5},{1,6},{1,7}}の場合、7C5通りに対してこの役リストを作成しその最大値をとる。

実際にプログラムを組むと、これの最大値は最弱の役から数えて407番目、すなわち{8,1,7}であると分かる。つまりストレートフラッシュで柄1(最弱)かつ最大値7である。

確かにディーラーの札5枚を全部使うとそれになり、そしてそれが最も強い手札となる。

他にも実施すると{{1, 1}, {1, 4}, {1, 5}, {2, 2}, {2, 3}, {2, 5}, {3, 5}}の例では柄1,2,3で5のスリーカードも強いが1,2,3,4,5のストレートも作れる。

実際出力は{211,{4,5,3}}となっており最弱から211番目の役、4すなわちストレートで最大の数は5、柄は3であることがわかり確かに{1,1},{2,2},{2,3},{1,4},({1,5}or{2,5}or{3,5})でストレートを形成し、その中でも最も柄の強い3が選ばれていることが分かる。

このプログラムは自身の2枚とディーラーの札5枚に対して最大の役を計算するプログラムであるが、ディーラーの札が見えていない場合は総当たり法により行う。(例えばディーラー3枚なら残り2枚の組み合わせを考えて実施する)

がしかし一つ問題がある。

入力の7つのカードの組から選ばれた5つの組に対してそれをID化しなければいけないのだが、その処理はできるものの1~52C5通りをチェックしなければならないので時間がかかる。そこで、{{1,1},{1,2},{1,3},{1,4},{1,5}}をID1とし、{{4,9},{4,10},{4,11},{4,12},{4,13}}をID52C5にすばやく変換するプログラムが必要。でなければここの操作に時間がかかり十数秒結果を出すのにかかってしまい実用化できなからである。

ということでその変換を行うプログラムを考えるが、このやり方過去にビンゴバルーンの組→ID変換でやったことあるような気がする。


テキサスホールデムの確率(4) カードの組に対する勝率実践

 とりあえずプログラムが組みあがったので確認する。

{1,{{1,1},{1,2},{1,3},{1,4},{1,5}},1533905/1533939,64973/64974}

第1要素はID、第2要素はカードの組、第3要素は勝率、第4要素はプレイヤーのカードの組を含めず52枚あると仮定した場合の簡略版(計算時間およそ半分)

一番わかりやすいのはID=1すなわち最弱の柄(1)で1,2,3,4,5のストレートフラッシュである。

第3要素では、このストレートフラッシュに勝てるものはこれ以外のすべてのストレートフラッシュである。

ちなみに例外として同じ柄の1,2,3,4,5vs6,7,8,9,10では5vs10で右の勝利

同じ柄の1,2,3,4,11vs6,7,8,9,10では14(1)vs10で左の勝利

前者はストレート由来なので最大は5という扱い、後者はフラッシュの離散値なので最大は1(A,14)であるということにする。

実際そのようなレアケースは見たことがないのでこの仕様かどうかは不明だが確率計算にもほぼ影響しないレベルなのでこれでよいとする。

この場合第3要素は同じ柄は6~13しか残っていないので6,7,8,9,10…9,10,11,12,13の4通り、他柄には全部負けるので1,2,3,4,5…10,11,12,13,1の10通りが3つずつで合計34通り。

よって第3要素では(47C5-34)/47C5=1533905/1533939の確率で勝利。

第4要素では柄1に対する1,2,3,4,5が存在することを仮定しているのでこの場合のみ引き分け。それ以外は全部負けるので勝率としてはこの1+39パターンのみに勝てない。よって

(2598960-40)/2598960の確率で勝利。

そして出力された結果は先ほどのデータ。

{1,{{1,1},{1,2},{1,3},{1,4},{1,5}},1533905/1533939,64973/64974}

第3要素は一致。

第4要素2598920/2598960=64973/64974なので一致。

これにより勝率が正しく計算できていることが分かる。

すると任意の組に対して勝率を厳密に計算することができた…のだが。

1パターン探索するのにおよそ1分程度かかってしまい、知っての通り総数は52C4=2598960通りある。となるとかかる時間は2598960分=43316時間なので1805日、すなわち5年くらいかかる。PC20台でやれば3か月だがそんなにmathematicaのライセンスを持っていないしPCによりメモリやCPUが違うのでおそらくこれより遅くなる。

なお他のパターンでも実践してみる。

{1,{{1,1},{1,2},{1,3},{1,4},{1,5}},0.999978,0.999985}

{2,{{1,1},{1,2},{1,3},{1,4},{1,6}},0.995872,0.99664}

{3,{{1,1},{1,2},{1,3},{1,4},{1,7}},0.995873,0.99664}

{4,{{1,1},{1,2},{1,3},{1,4},{1,8}},0.995873,0.99664}

{5,{{1,1},{1,2},{1,3},{1,4},{1,9}},0.995874,0.99664}

{6,{{1,1},{1,2},{1,3},{1,4},{1,10}},0.995873,0.99664}

{7,{{1,1},{1,2},{1,3},{1,4},{1,11}},0.995873,0.99664}

{8,{{1,1},{1,2},{1,3},{1,4},{1,12}},0.995872,0.99664}

{9,{{1,1},{1,2},{1,3},{1,4},{1,13}},0.995871,0.99664}

{10,{{1,1},{1,2},{1,3},{1,4},{2,1}},0.913909,0.891241}

{11,{{1,1},{1,2},{1,3},{1,4},{2,2}},0.49752,0.501177}

{12,{{1,1},{1,2},{1,3},{1,4},{2,3}},0.518684,0.533683}

{13,{{1,1},{1,2},{1,3},{1,4},{2,4}},0.53989,0.566188}

{14,{{1,1},{1,2},{1,3},{1,4},{2,5}},0.991489,0.992512}

やはりストレートフラッシュでは強く、フラッシュでは勝てる確率はおよそ99.59%であり、2のワンペア(勝率49.75%)より3のワンペアの方が強い(勝率51.87%)ことが分かり、同じ役でも数字の違いで勝率が大きく変わることが分かる。ちなみにID2→5で勝率があがっているのは同じ柄でのストレートフラッシュを封じているから(ID=5のとき、1,2,3,4,9で構成される場合同じ柄のストレートフラッシュは5~8では4個なので作れず、10~13においても4個なのでまったく作れないからである。ID5→ID9で勝率が下がるのはその作れなかったストレートフラッシュが生成してくるからである。たとえばID6では柄1の5,6,7,8,9のストレートフラッシュが相手側に存在するからである。とはいえその確率は0.0001%程度しか変わらないので正直誤差ではあるが。

おまけにいちいちこんな計算時間をとることもできないので、厳密な勝率を求めることは時間制約的に不可能。

したがって簡易バージョンを考える必要がある。

それは最も弱いカードから最も強いカードまで順にその役の成立確率を並べるというものである。

とにかく相手のパターン総数2000000~3000000通りをいちいち調べ上げるのに1分程度かかるので、ここをどうにかしたいわけである。ランダムに10000回相手の手数を判定してそれでおおまかな勝率を出すという手もあるが、とりあえずそれと相手のカードが52枚からの確率分布と仮定してどの自分のカードに対しても同じとして処理を簡略化するのとどちらが真の勝率に近いのかを、何個か実際に1分かけて出した結果とサンプリングしてその優劣をお互いに判定してみる。

とはいえ、ランダム10000回ならばmathematicaを常に起動して自動化の最中でやりとりしなければならないので他PCでライセンスがなければ使用できないのが残念なところ。なので実践的にはあらかじめ用意した順に配当が強くなる確率分布を作ってそれとの比較が手っ取り早い。ちなみにその分布を自身の手に応じて山札が減ったバージョンで作ろうとすると当たり前だがすさまじい数の処理を要求されるので意味がない。

具体的には{ノーペア(柄1、数字2)、ノーペア(柄1、数字3)、…ロイヤル(柄3)、ロイヤル(柄4)}のように、各役とその同じ役同士での強さまで考慮した確率分布を出す。でないとワンペアのAと2ではかなり勝率が違うことが分かっているからである。

この相手の役の確率分布の配列は常に固定であり(時間の関係上固定せざるを得ない)、自身の役を判定してそれをこれと比較して勝率を計算するだけなので、その数値を格納するエクセルシートでもあれば比較が可能と思われる。

こういうイメージでポーカーの勝率を再構築していくことにする。

とにかくカジプロで強くなる、というより本目的はRMTで稼ぐためにはまずチップを稼げないと話にならないので、そこをどうにかしなければならない。

一応ポーカーではその簡略化したプログラムで勝負できなくもないが、ポーカーだとおそらく勝率計算ツールとかまだ簡単な部類なので同業者が発生している可能性があるため危険。より難易度の高いテキサスホールデムの方が持ち込み金も多いし、まねできる者が少ないという点では有利。


2024年7月7日日曜日

テキサスホールデムの確率(3) ポーカーの確率計算

 テキサスホールデムはポーカーの派生版のようなものなので、まずはポーカーの役の確率を計算する。全カードのパターン52C4=2598960通りに対してそれぞれ役を判定する。

ワンペアの部分集合はツーペアとスリーカード、その共通集合がフルハウスで、ストレートおよびフラッシュはワンペアと空集合でその共通集合はストレートフラッシュ、さらにその部分集合がロイヤルストレートフラッシュとなる。フォーカードはスリーカードの部分集合(ツーペアの部分集合ともとれるが)であることを考慮して場合分けするとwikipediaにあるように

その組み合わせはノーペアから順に

{1302540, 1098240, 123552, 54912, 10200, 5108, 3744, 624, 36, 4}

となる。確かに一致していることが確かめられる。しかし我がしたいのはこんな基本的なことではなく、これをどうカジプロに応用するかである。普通にテキサスホールデムをカジプロでプレイしているとおそらくぼこぼこにされる(実際適当にプレイしていると勝てないが、今にみとけ)。

カジプロのルールではペア系(ノーペア含む)とストレートはその数字で強さが決まり、(ロイヤル)ストレートフラッシュとフラッシュはその柄で強さが決まる。よって勝ち負けを正確に判定するためには同じ役でその数字と柄の取得が必要となる。

よってこれを解析するとき以下のような解析にしている。

{2140000,{{2,2},{2,11},{3,1},{3,2},{4,1}},2,14,4,0,0,{2,11,1,2,1},{2,11,14,2,14}}

第1要素はIDすなわち何番目か、第2要素はカードの組(あとで順序定義を簡単にするために1=♣、2=♦、3=♥、4=♠とする)、第3要素は役名、第4要素はその役での数字の強さ、第5要素はその役での柄の強さを表す。なおこの2つの要素はフラッシュなどでは先に柄を判定するため、この場合は反転する。第5要素はストレートかどうかのフラグ、第6要素はフラッシュかどうかのフラグで、出力としては不要。第7要素は数字のみの抽出、第8要素はその数字に対してA=14という強さ扱いにしたときのもの(あとで比較が容易になる)。

これにより同じ役でも勝敗を判定するのが簡単になるわけである。

というわけで次に行うのは勝敗判定である。これは第4要素の大小、第4要素が同じ場合第5要素の大小で決する。それも同じ場合は引き分け。ただまだベットの方式などを実はあまり把握していないので実際にプレイしたり動画を見たりしてルールを把握しなければならない。でないと遺伝的アルゴリズム実施時に重要なBETの概念を取得できないのである。



2024年7月2日火曜日

テキサスホールデムの確率(2) 勝つためにはどうすればよいか

 テキサスホールデムはプレイヤー同士の戦いのため、ディーラーとの基本1対1のペイアウト率100%割のゲームに比べて勝てる可能性がある。

しかし相手はほとんどカジプロをやりこんでいる者ばかりなので、普通にやっているとおそらく勝てない。実際リバーシもことごとく惨敗している。

しかしテキサスホールデムで稼いで売っているRMT業者もいるので、おそらくここが攻略所だと踏んでいる。とりあえず現時点ではカジプロではRMT購入側であるが、このプログラムがうまく行けばチップの自給自足が可能で、かつ売却もいずれは視野に入れる。

ダイヤ購入での時間短縮はどうにもならないが、とりあえずチップを稼げば楽しめるし金も稼げる。できれば維持のために月100万はほしいがおそらく買い手があまりいない。

さてテキサスホールデムにおいてはまず自身の勝率を正確に把握することが重要で、そのうえで相手の掛け金で相手の手の良さが尤度比で変わることを考慮し、確率分布を再計算する必要がある。

しかしながら尤度比は人によって異なる(ワンペアでも強気にいく者の場合は尤度比は低くなり、確実に勝てると踏んだ時のみBET額を上げる者の場合は尤度比は大きくなる)ので、ここに関しては自分の(=一般的な人の考え方)データで学習させたいが、機械学習はあまり知らないがもしかすると遺伝的アルゴリズムでいけるかもしれない。多数のCPUで長期間対戦させて相手の尤度比をどのように決定すれば全体的な勝率(実際はペイアウト率すなわち時間チップ高率)があがるかでできるかもしれないができないかもしれない。

さすがに10年くらい経った普通のゲームで、ここまでデータとプログラムを駆使してできるプレイヤーはおそらくほぼいないと思うので、おそらく通常のプレイヤー相手ならば勝てるかと思われる。

ただ初の試みなのでこれが成功するかどうかはわからないし失敗に終わる可能性もある。しかしやってみる価値はあるので、とりあえずまずは5つのカードから役を判定するプログラムを作る。順番としては

カードから役を判定

手元の札の全パターンに役を取得し確率分布(離散)を計算

相手にも同様のことを行う

なおそれぞれの確率分布は役の個数分しかデータはないので先に計算したものを利用する手もあるがそのあたりはデータ量と計算時間で都度判断する

勝利確率を計算

相手の挙動により勝利確率を調整

という流れになる。