概要
麻雀の何切る問題において、打牌の受け入れ枚数、聴牌確率、和了確率、期待値を計算するアプリ「麻雀何切るシミュレーター」について紹介します。
麻雀何切るシミュレーター
麻雀何切るシミュレーター は、手牌を入力すると、以下の情報を計算するアプリです。
- 手牌が13枚の場合は、有効牌を表示します。
- 手牌が14枚の場合は、各打牌の受け入れ枚数、点数期待値、和了確率、聴牌確率を表示します。(4向聴以上の場合は受け入れ枚数のみ)
対応している機能
- 場風、自風、ドラ、槓ドラ、赤ドラ対応、副露した手牌を設定できます。
- 向聴戻し、手変わり、ダブル立直、一発、海底撈月、裏ドラの考慮の有無を設定できます。
- テキスト形式で結果をコピーできます。
- 一般手、七対子手、国士無双手に対応しています。
- 打ち筋を期待値最大化、または和了確率最大化から設定できます。
4向聴以上の手牌の場合、計算量が膨大になり、数秒以内に計算するのが困難であるため、受け入れ枚数のみ表示します。 4向聴以上の場合は、期待値に基づく打牌を行えなくても、孤立字牌など明らかに不要な牌を整理している段階であるため、実用上はさほど困らないかと思います。
免責事項
- プログラムは開発中であり、不具合がある可能性があります。
- アプリが示す上位の打牌が実戦において必ずしも正着であるとは限りません。あくまで参考程度に活用ください。
- 期待値の計算方法については記事 麻雀における期待値の計算方法 を参照ください。
- ご意見や不具合報告がありましたら、こちらの記事のコメント欄か、GitHub のレポジトリ mahjong-cpp の issue にコメントしてください。
何切る問題の例
ネット上で見つけた何切る問題に関して、このアプリで期待値を計算した例を紹介します。計算結果は期待値が高い順に上位の打牌を載せました。
12577m222468p445s (2向聴)
場風牌: 東, 自風牌: 東, 1巡目, 手牌の種類: 一般手, ドラ: [南]
引用元: 現代麻雀技術論 – 牌効率論26.断ヤオ九
シャンテン戻しになってもタンヤオ確定なら孤立3~7>ペンチャン。
計算結果
打: 一萬, 受け入れ枚数: 23種78枚, 有効牌: [123456789m23456789p234567s] 向聴戻し
期待値: 1696点, 和了確率: 18.46%, 聴牌確率: 70.02%
打: 二萬, 受け入れ枚数: 23種78枚, 有効牌: [123456789m23456789p234567s] 向聴戻し
期待値: 1655点, 和了確率: 17.85%, 聴牌確率: 69.37%
打: 四索, 受け入れ枚数: 5種20枚, 有効牌: [3m57p36s]
期待値: 1466点, 和了確率: 20.87%, 聴牌確率: 72.54%
向聴戻しになりますが、断么九を確定させる 12m 辺張落としが良さそうです。
2345m113479p6778s (2向聴)
場風牌: 東, 自風牌: 東, 1巡目, 手牌の種類: 一般手, ドラ: [南]
引用元: 現代麻雀技術論 – 牌効率論56.2シャンテン戻し
2シャンテン戻しのパターン 優良孤立牌(4連形、中膨れ)×2
計算結果
打: 九筒, 受け入れ枚数: 19種64枚, 有効牌: [1234567m1256789p56789s] 向聴戻し
期待値: 2295点, 和了確率: 36.30%, 聴牌確率: 86.42%
打: 七筒, 受け入れ枚数: 18種60枚, 有効牌: [1234567m125789p56789s] 向聴戻し
期待値: 2180点, 和了確率: 34.65%, 聴牌確率: 85.94%
打: 二萬, 受け入れ枚数: 3種12枚, 有効牌: [258p]
期待値: 2117点, 和了確率: 35.73%, 聴牌確率: 86.97%
向聴戻しになりますが、79p 嵌張落としで 2345m、6778s のくっつき狙いが良さそうです。
133789m77p3378s北北 (2向聴)
場風牌: 東, 自風牌: 東, 1巡目, 手牌の種類: 一般手, ドラ: [南]
計算結果
打: 七筒, 受け入れ枚数: 6種18枚, 有効牌: [23m369s北]
期待値: 1301点, 和了確率: 20.03%, 聴牌確率: 69.68%
打: 三索, 受け入れ枚数: 6種18枚, 有効牌: [23m7p69s北]
期待値: 1299点, 和了確率: 20.01%, 聴牌確率: 69.65%
打: 北, 受け入れ枚数: 6種18枚, 有効牌: [23m7p369s]
期待値: 1200点, 和了確率: 20.22%, 聴牌確率: 70.16%
7p または 3s のどちらでも良さそうです。
344678m5r5789p125s (1向聴)
場風牌: 東, 自風牌: 東, 1巡目, 手牌の種類: 一般手, ドラ: [四索]
引用元: No.19851の集計結果 – 麻雀で何切る!?
4m: 48票、1s: 29票、5s: 19票、2s: 14票
計算結果
打: 一索, 受け入れ枚数: 15種50枚, 有効牌: [1234569m5p1234567s] 向聴戻し
期待値: 3743点, 和了確率: 30.64%, 聴牌確率: 84.71%
打: 二索, 受け入れ枚数: 15種50枚, 有効牌: [1234569m5p1234567s] 向聴戻し
期待値: 3694点, 和了確率: 30.04%, 聴牌確率: 84.71%
打: 四萬, 受け入れ枚数: 3種12枚, 有効牌: [25m3s]
期待値: 3537点, 和了確率: 33.21%, 聴牌確率: 86.33%
12s の辺張落としがよいという結果になりました。
79m445789p3489s西西 (2向聴)
場風牌: 東, 自風牌: 東, 1巡目, 手牌の種類: 一般手, ドラ: [七萬]
引用元: 問題No5520の集計結果 – 阿知賀女子学院の「何切る?」
1位: 4p、2位: 5p、3位: 西
計算結果
打: 四筒, 受け入れ枚数: 6種24枚, 有効牌: [8m36p257s]
期待値: 2689点, 和了確率: 22.30%, 聴牌確率: 73.43%
打: 九索, 受け入れ枚数: 7種24枚, 有効牌: [8m346p25s西]
期待値: 2615点, 和了確率: 26.00%, 聴牌確率: 78.73%
打: 八索, 受け入れ枚数: 7種24枚, 有効牌: [8m346p25s西]
期待値: 2600点, 和了確率: 25.96%, 聴牌確率: 78.68%
4p を切って、三色を狙いましょう。
233m34568p223789s (1向聴)
場風牌: 東, 自風牌: 東, 1巡目, 手牌の種類: 一般手, ドラ: [七萬]
計算結果
打: 八筒, 受け入れ枚数: 18種61枚, 有効牌: [12345m12345678p12345s] 向聴戻し
期待値: 4198点, 和了確率: 41.99%, 聴牌確率: 92.93%
打: 三萬, 受け入れ枚数: 3種12枚, 有効牌: [14m7p]
期待値: 3749点, 和了確率: 37.97%, 聴牌確率: 88.56%
打: 二索, 受け入れ枚数: 3種12枚, 有効牌: [7p14s]
期待値: 3726点, 和了確率: 37.91%, 聴牌確率: 88.65%
私は頭固定はしないで 2s か 3m 切りかなと思ったのですが、コンピューターの計算結果によると、向聴戻しの 8p 切りで受け入れを増やすのがよいという結果になりました。気になったので 一人麻雀練習機 のほうでも計算してみましたが、同じく 8p 切りの期待値が一番高くなりました。
666778m677p66778s (1向聴)
場風牌: 東, 自風牌: 東, 1巡目, 手牌の種類: 一般手, ドラ: [六筒]
計算結果
打: 七筒, 受け入れ枚数: 4種14枚, 有効牌: [58p58s]
期待値: 8550点, 和了確率: 43.29%, 聴牌確率: 89.41%
打: 七萬, 受け入れ枚数: 7種21枚, 有効牌: [69m578p58s]
期待値: 8520点, 和了確率: 44.19%, 聴牌確率: 90.15%
打: 六萬, 受け入れ枚数: 4種14枚, 有効牌: [58m58s]
期待値: 6770点, 和了確率: 44.75%, 聴牌確率: 90.29%
7m または 7p 切りで三色を狙いましょう。
まとめ
概ね、人間が考える打牌と同じ結果がコンピューターの計算でも得られることが確認できました。
コメント
コメント一覧 (102件)
別件で失礼します。
223344p11235678s で1s>8sとなりましたが、明らかに1s切り立直より8s切り平和立直した方がいいように思えます。おそらく1s切り闇テンでタンヤオ変化を待つのを高評価しすぎています。
githubを見た限り闇テンを考慮できるようになったようなのですが、その計算で何か問題が生じていないでしょうか?(たとえば立直後なのに手代わりを考慮している、など)
れいのるず様
> 明らかに1s切り立直より8s切り平和立直した方がいいように思えます。おそらく1s切り闇テンでタンヤオ変化を待つのを高評価しすぎています。
確認しました。仰る通り、明らかに 8s > 1s です。
> githubを見た限り闇テンを考慮できるようになったようなのですが、その計算で何か問題が生じていないでしょうか?
すみません。ご指摘の通りで、副露していない場合は、点数計算時に立直、自摸をつけているのに、聴牌でも手変わりの探索を行ってしまっています。
https://github.com/nekobean/mahjong-cpp/blob/master/src/mahjong/core/expected_score_calculator.cpp#L302
期待値、確率計算についてはネットで見つけた以下のサイト様を参考にさせていただきましたが、こちらはダマのみの探索となっています。
https://tomohxx.github.io/mahjong-algorithm-book/probability/#_7
そのため、役の評価が高くなり、実戦と乖離した結果が見られたため、何切るシミュレーターの実装では、和了まで手変わりや向聴戻しも探索する一方、点数計算時に立直をつけるという形になっています。
(例: 77m133789p3378s白白 で今の実装: 3s>1p>7m に対して、ダマのみだと 1p>8s>7sと三暗刻など狙っているのか、対子評価が高く明らかに変)
改善するには、聴牌時に立直する場合とダマで手を進める場合に分岐して手牌を探索して、期待値、確率計算時の聴牌の手牌で、立直とダマで進めた場合を比較して最大値のほうを採用するように修正する必要があると考えています。(立直して探索する場合は手変わり、向聴戻し不可とする)
ご指摘いただいた点は早急に改善したいと思いますので、どうすればよいか少し考えてみます。
少なくとも場況を考慮しない平面何切るについては正確な回答が出せるようにしていきたいと考えておりますので、
貴重なフィードバックをいただき大変感謝です。
今のバージョンの精度ですが、例えば「ウザク式麻雀学習 牌効率」では鳴きが影響しない問題129問中14問がシミュレーターが不正解となっており、とくに1、2はシミュレーターが明らかにおかしいので、もしかしたらご指摘いただいた問題が影響しているかもしれないです。
# 牌姿 (シミュレーターの答え) (正解)
No1. 466m12388p224789s (8p) (答え6m)
No2. 3456m6778p4456s44z (4z) (答え4s)
No3. 788m11379p1389s77z 1s(答え8m)
No4. 12367m24789p1199s 9s(答え2p)
No5. 466m03578p799s777z (4m) (答え7s)
No6. 456m23468p112367s (8p) 答え1s
No7. 456m77899p112367s (1s) 答え7p
No8. 456789m0235p1124s (1s) 答え4s
No9. 3456m45689p22399s (9p) 答え2s
No10. 344678m3456p34r56s (3m) 答え6s
No11. 33678m3344p23478s (8s) 答え4p
No12. 237799m123r567p68s (9m) 答え8s
No13. 67m34599p2234445s (9p) 答え 2s
No14. 34788m222344p678s (7m) 答え4p
丁寧な返信ありがとうございます。現況がよく分かってきました。なかなか修正が難しそうですが、よりよいシュミレータになることを期待して待ちます。頑張ってください!
234m12345566p567s(6巡目)という牌姿で、
打1pの断公九4枚待ちと、打5pの平和5枚待ちの比較をしたいと思ったのですが、
結果、1p>2p>6P>5pとなりました
打2pや打6pが打5pより有利というのはよくわからないです
既出の問題と重なるのか、問題無い挙動なのか私には判断できませんが、一応ご報告します
コメントありがとうございます。
1p>5p>その他 が正解と思います。
1つ前のコメントでのやり取りが原因(聴牌以降の手牌で立直しているのに手変わりを考慮してしまっている)と思われる、聴牌の手牌のシミュレーション結果が不自然がことがあり、
現在改善方法について検討中です。
いつもシミュレーターをありがたく使わせていただいております。
終盤にやや和了・聴牌確率を軽視しているような気がしたため、聴牌の牌姿を17巡目(例: 東一局0本場 西家 17巡目 ドラ: 九筒 44567m34r5789p34s北)などでシミュレーションを回してみると、すべての打牌で期待値・和了・聴牌確率確率0点となっておりました。少なくとも聴牌確率については100%となるはずで間違っていそうに見えるのと、聴牌料を(何人聴牌と定義するかで変わりやや人為的ですが)適当に平均1500点などと仮定してシミュレーションできると、終盤の推奨手がより実戦に近くなりそうで良いのではないかと思いました。
ご検討のほどよろしくお願いいたします。
ご利用いただきありがとうございます。
ご指摘いただいた通り、17巡目であと1回自摸があるので、0%になるのはおかしいです。
今課題として、この問題と、立直に起因して聴牌の手牌での計算結果が不自然な場合があるという問題を認識しております。
https://github.com/nekobean/mahjong-cpp/issues/24
https://github.com/nekobean/mahjong-cpp/issues/25
年内は時間取れなさそうであるため、修正は1月以降になるかもしれませんが、
解決したいと考えております。
引き続き、よろしくお願いします。