概要
麻雀の何切る問題において、打牌の受け入れ枚数、聴牌確率、和了確率、期待値を計算するアプリ「麻雀何切るシミュレーター」について紹介します。
麻雀何切るシミュレーター
麻雀何切るシミュレーター は、手牌を入力すると、以下の情報を計算するアプリです。
- 手牌が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 切りで三色を狙いましょう。
まとめ
概ね、人間が考える打牌と同じ結果がコンピューターの計算でも得られることが確認できました。
コメント
コメント一覧 (105件)
こんにちは。
麻雀何切るシミュレーターをいつも使用させていただいています。
UI機能を少し追加できないか試したくなりGithub に公開していただいているソースを動かそうと試みたのですが、Vueのフロントエンド(mahjong-calculator)は表示できたものの C++ のバックエンド(mahjong-cpp)の動かし方がよく分かりませんでした。Docker 内でのcppソースのビルドまではできて sample のスクリプト(sample_calculate_expexted_value など)はいくつか動かせたのですが、APIサーバーを起動するにはどうすれば良いのでしょうか?
コメントありがとうございます。
デフォルトでは、サンプルプログラムしかビルドされないようになっているため、Linux 上でサーバーをビルドする場合は cmake するときに -DBUILD_SERVER=ON オプションをつける必要があります。Windows でビルドする場合は cmake-gui で該当オプションを有効にして configure してください。
# git clone https://github.com/nekobean/mahjong-cpp.git
# cd mahjong-cpp
# mkdir build && cd build
# cmake -DBUILD_SERVER=ON .. <---ここを変更
# make -j$(nproc)
ビルドしたサーバーはポート番号 8888 で待ち受けるようになっています。(ポート番号はこちらで変更できます。 https://github.com/nekobean/mahjong-cpp/blob/master/src/server/server.cpp#L337)
サーバーを起動後に Vue 側が生成した json データを `<サーバーを起動しているPCのIP>:8888` に対して post すると、結果を json で返します。
ローカル以外で試す場合、以下の箇所で post 先の URL を修正する必要があります。
https://github.com/nekobean/mahjong-calculator/blob/master/src/components/Calculator.vue#L565
POST している JSON の仕様は以下になります。
https://github.com/nekobean/mahjong-cpp/blob/master/docs/%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%BB%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E4%BB%95%E6%A7%98.ipynb
1年程更新できていないですが、機能追加の要望やプルリクも歓迎です。
ご不明な点があれば、なんでも聞いてください。
早速のご返答ありがとうございます!試してみます。
> 機能追加の要望やプルリクも歓迎です。
ぜひコントリビュートさせていただければと思います!よろしくお願いいたします。
こんにちは。
いつもありがたく使わせてもらっています。
要望なのですが
手牌と出力結果の間にある欄を任意に非表示にする。又は出力結果の真上に手牌を表示することは可能でしょうか。
いつもスマホで手牌と結果を2回に分けてスクショしているのですがこちら非表示できると大変有り難いです。
以上よろしくお願いします。
コメントありがとうございます。
機能追加のほうを検討したいと思います。
issue に登録しました
https://github.com/nekobean/mahjong-cpp/issues/12
こんにちは。
いつもありがたく使わせていただいております。
3巡目 33456677p233345sの手で、打2sが受け入れ22枚、打3pが受け入れ27枚でありながら、聴牌確率は打2sの方が上になっています。何故でしょうか?
コメントありがとうございます。
数万の手牌を評価しているため、具体的に解析するのは難しいのですが、デフォルトでは「向聴数が変化しない手変わり」または「向聴戻し」は和了までの間に最大1回だけできることにして探索しているため、そこで差が出ていると思います。
有効牌の枚数は向聴数を1つ下げる牌の種類ですので、打3pまたは打2sとしたあと、有効牌以外の牌を引いた際に2sのほうが聴牌しやすくなる変化が多いということなのではないかと思われます。
私は何切るがあまり得意でないため、理由について説得力のある説明ができず、すみません。
「考慮項目」の手変わりや向聴戻しを無効にすると、受け入れ枚数が一番多い 3p が一番聴牌確率が高くなります。
参考までに、他の平面何切るシミュレーターの結果も合わせて載せておきます。
一人麻雀練習機 (http://ara.moo.jp/mjhmr/index.htm)
打2s 期待値: 5416 和了確率: 49.97% 聴牌確率: 98.50% (1位)
打3p 期待値: 5112 和了確率: 49.80 % 聴牌確率: 95.83 %
https://i.imgur.com/mKz7RPg.jpg
向聴戻しや手変わり次第で聴牌確率が逆転することを考慮できておりませんでした。お手数をおかけしました。
ご回答いただきありがとうございます。