概要
麻雀の何切る問題において、打牌の受け入れ枚数、聴牌確率、和了確率、期待値を計算するアプリ「麻雀何切るシミュレーター」について紹介します。
麻雀何切るシミュレーター
麻雀何切るシミュレーター は、手牌を入力すると、以下の情報を計算するアプリです。
- 手牌が13枚の場合は、有効牌を表示します。
- 手牌が14枚の場合は、各打牌の受け入れ枚数、点数期待値、和了確率、聴牌確率を表示します。(4向聴以上の場合は受け入れ枚数のみ)
対応している機能
- 場風、自風、ドラ、槓ドラ、赤ドラ対応、副露した手牌を設定できます。
- 向聴戻し、手変わり、ダブル立直、一発、海底撈月、裏ドラの考慮の有無を設定できます。
- テキスト形式で結果をコピーできます。
- 一般手、七対子手、国士無双手に対応しています。
- 打ち筋を期待値最大化、または和了確率最大化から設定できます。

4向聴以上の手牌の場合、計算量が膨大になり、数秒以内に計算するのが困難であるため、受け入れ枚数のみ表示します。 4向聴以上の場合は、期待値に基づく打牌を行えなくても、孤立字牌など明らかに不要な牌を整理している段階であるため、実用上はさほど困らないかと思います。
免責事項
- プログラムは開発中であり、不具合がある可能性があります。
- アプリが示す上位の打牌が実戦において必ずしも正着であるとは限りません。あくまで参考程度に活用ください。
- 期待値の計算方法については記事 麻雀における期待値の計算方法 を参照ください。
- ご意見や不具合報告がありましたら、こちらの記事のコメント欄か、GitHub のレポジトリ mahjong-cpp の issue にコメントしてください。
何切る問題の例
ネット上で見つけた何切る問題に関して、このアプリで期待値を計算した例を紹介します。計算結果は期待値が高い順に上位の打牌を載せました。
12577m222468p445s (2向聴)
場風牌: 東, 自風牌: 東, 1巡目, 手牌の種類: 一般手, ドラ: [南]

引用元: 現代麻雀技術論 – 牌効率論26.断ヤオ九
シャンテン戻しになってもタンヤオ確定なら孤立3~7>ペンチャン。
計算結果
向聴戻しになりますが、断么九を確定させる 12m 辺張落としが良さそうです。
2345m113479p6778s (2向聴)
場風牌: 東, 自風牌: 東, 1巡目, 手牌の種類: 一般手, ドラ: [南]

引用元: 現代麻雀技術論 – 牌効率論56.2シャンテン戻し
2シャンテン戻しのパターン 優良孤立牌(4連形、中膨れ)×2
計算結果
向聴戻しになりますが、79p 嵌張落としで 2345m、6778s のくっつき狙いが良さそうです。
133789m77p3378s北北 (2向聴)
場風牌: 東, 自風牌: 東, 1巡目, 手牌の種類: 一般手, ドラ: [南]

計算結果
7p または 3s のどちらでも良さそうです。
344678m5r5789p125s (1向聴)
場風牌: 東, 自風牌: 東, 1巡目, 手牌の種類: 一般手, ドラ: [四索]

引用元: No.19851の集計結果 – 麻雀で何切る!?
4m: 48票、1s: 29票、5s: 19票、2s: 14票
計算結果
12s の辺張落としがよいという結果になりました。
79m445789p3489s西西 (2向聴)
場風牌: 東, 自風牌: 東, 1巡目, 手牌の種類: 一般手, ドラ: [七萬]

引用元: 問題No5520の集計結果 – 阿知賀女子学院の「何切る?」
1位: 4p、2位: 5p、3位: 西
計算結果
4p を切って、三色を狙いましょう。
233m34568p223789s (1向聴)
場風牌: 東, 自風牌: 東, 1巡目, 手牌の種類: 一般手, ドラ: [七萬]

計算結果
私は頭固定はしないで 2s か 3m 切りかなと思ったのですが、コンピューターの計算結果によると、向聴戻しの 8p 切りで受け入れを増やすのがよいという結果になりました。気になったので 一人麻雀練習機 のほうでも計算してみましたが、同じく 8p 切りの期待値が一番高くなりました。

666778m677p66778s (1向聴)
場風牌: 東, 自風牌: 東, 1巡目, 手牌の種類: 一般手, ドラ: [六筒]

計算結果
7m または 7p 切りで三色を狙いましょう。
まとめ
概ね、人間が考える打牌と同じ結果がコンピューターの計算でも得られることが確認できました。
コメント
コメント一覧 (124件)
234m12345566p567s(6巡目)という牌姿で、
打1pの断公九4枚待ちと、打5pの平和5枚待ちの比較をしたいと思ったのですが、
結果、1p>2p>6P>5pとなりました
打2pや打6pが打5pより有利というのはよくわからないです
既出の問題と重なるのか、問題無い挙動なのか私には判断できませんが、一応ご報告します
コメントありがとうございます。
1p>5p>その他 が正解と思います。
1つ前のコメントでのやり取りが原因(聴牌以降の手牌で立直しているのに手変わりを考慮してしまっている)と思われる、聴牌の手牌のシミュレーション結果が不自然がことがあり、
現在改善方法について検討中です。
探索範囲を拡大すると期待値で見たときに不自然な選択が上位になることがあります。実践では先制立直を打つことが重要なので高くて遠い手は見限ることがあります。探索範囲は1手替わりに止めて打点と聴牌速度のバランスをとるのが良いと思います。
https://github.com/nekobean/mahjong-cpp/commit/ba3f854bda2a961fc2b00866b3daf6f1a6dcc2b9
To: tomohxx さん
すみません、URL 付きのためコメントが見えなくなっており、今気づきました
アドバイスいただきありがとうございます。
こちらのほうに返信させていただきました。
https://github.com/nekobean/mahjong-cpp/issues/24#issuecomment-2571282122
いつもシミュレーターをありがたく使わせていただいております。
終盤にやや和了・聴牌確率を軽視しているような気がしたため、聴牌の牌姿を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月以降になるかもしれませんが、
解決したいと考えております。
引き続き、よろしくお願いします。
ありがとうございます、楽しみにしています!
issue の方にもコメントさせていただきました!
ver0.90と0.9.4で結果が違うのですが何故でしょう?
例)46788m4667pr56789sという牌姿だと
期待値順にver0.9.0は4m4p6p、ver0.9.4だと8m4m9sという並びになります。
ご利用ありがとうございます。
v.0.9.0 と v0.9.4 では、探索範囲や七対子を考慮するかなど、アルゴリズムに大きな変更をしているため、結果は異なる場合があります。
基本的には v0.9.4 のほうが精度は向上していると思います。
以下、一人麻雀練習機で試した結果です。(赤が対応していないため、46788m4667p56789s としています)
9s: 3707.14
8m: 3542.83
4m: 3419.90
何切るシミュレーター v0.9.4
46788m4667p56789s
## 計算結果
打: 九索, 有効牌: 7種23枚, 458m58p58s
期待値: 2888点, 和了確率: 25.90%, 聴牌確率: 85.03%
打: 八萬, 有効牌: 20種69枚, 234569m23456789p456789s
期待値: 2826点, 和了確率: 30.92%, 聴牌確率: 90.87%
打: 四萬, 有効牌: 19種63枚, 56789m23456789p456789s
期待値: 2814点, 和了確率: 29.85%, 聴牌確率: 90.10%
となり、上位3つの打牌は一致しております。
参考になれは幸いです。
残り枚数を1つ1つ入力するのは時間がかかるので、ボタン1つで枚数の増減ができるようにすることは出来ますでしょうか。(例えば、ある牌のマイナスのボタンを押すと、その牌の残り枚数が1減るとか)
ご利用ありがとうございます。
お使いの環境はスマホでしょうか?
PC の場合、各牌の右側に±できるボタンがあり、そちらで加減できるようになっています。
そのうち、スマホからも使いやすいように UI を刷新する予定です。
シミュレーターで良形聴牌枚数を出す、という計算は難しそうでしょうか? もし可能であれば、期待値などよりもシミュレーションの条件に依存しづらいデジタルな指標が増えて嬉しいかなと思いました。和了確率が概ね良形聴牌確率に相当するのかもしれませんが、最後まで一人でツモりきれるシミュレーションの性質上、良形率はやや軽視しそうな気がするので、そこを自力で判断して補正したいときに役立つかなと思いました。
コメントありがとうございます。
良型聴牌をどう定義するかですが、聴牌時の待ちが8枚以上になる確率と定義してその確率を計算するか、聴牌時の待ち枚数の期待値を算出することはできます。
3向聴だと計算量が逼迫しているため、計算量的に問題なさそうであれば入れようと思います。
今いくつかあるバグ (聴牌率の計算がおかしい問題、立直・ダマの分岐を考慮できていない問題) を先に直そうと思うので先になってしまうかもしれませんが、issue のほうに追加させていただきました。
https://github.com/nekobean/mahjong-cpp/issues/32
ご返信ありがとうございます!
計算量の問題はあるかと思いますので適宜1~2向聴以下のみなどに絞るのは構わないかなと思いました!
優先度はお任せしますので是非よろしくお願いします!楽しみにしています!
一部シャンテンバック選択が表示されない手牌があります。不具合でしょうか?
確認:
1235677789m 23p 22z→表示なし
567789m 345677s 57p →表示なし
3335m 23468p12669s→表示あり(ランダム生成、手打ち時確認済み)
ご利用ありがとうございます。
現在、立直に関する処理に一部問題があり、修正を予定しています。
聴牌形で違和感のある計算結果が出やすく誤解を招く恐れがあったため、問題の修正が完了するまで、一時的に
聴牌形では向聴戻しは無効にしております。
1月は時間が取れなかったのですが、2月中には修正できればと考えております。
了解です、回答ありがとうございます
最近よく使用させていただいています!
流局時の、テンパイ料収入と支出を含んだ期待値も、別で表記がほしいです。
ご利用ありがとうございます。
得点期待値は一人麻雀という他家のいない特殊な設定の元で計算された値のため、得点期待値は平面何切るにおける打牌の優越の判断にはある程度参考にできるものの、得点期待値の大きさ自体を実践でのリーチ判断などにそのまま使うことはできないと考えられます。
(4麻において、得られる点数が3000点未満なら降りるという判断があったとして、一人麻雀での期待値が4000点と出てきたとしても、4麻での期待値ではないので、値の大小の比較はできない)
1人麻雀では他家に先に和了られることがないため、和了づらい高い役やドラが過剰に評価される傾向がありますので、それを是正するためにご意見いただいた聴牌の有無による収支を考慮するといったことは有用かもしれません。
他家がいないので、4麻でのノーテン罰符、聴牌収入をそのまま期待値計算に入れ込むことは難しいですが、より4麻での参考になる値が算出できるような方法を検討したいと思います。
コメントおよびご意見いただきありがとうございます。mm
「ランダムな手牌」ボタンを押した際、字牌が選択されないのは仕様なのでしょうか?
「ランダムな手牌」ボタンを押した際、字牌を含まないようになっていることは仕様になります。
ランダムな手牌は何切る問題を生成することを意図する機能です。以下の理由から字牌は含まないようにしております。
・孤立字牌などがある場合は字牌から切るケースが多いので、あまり迷う手牌にならない場合が多い
・役牌の対子の価値は副露込みで判断する必要がありますが、シミュレーターの1人麻雀では他家はおらず副露は考慮されないため、2枚持ちの役牌の価値が実戦より低く見積もられてしまうため
コメントいただきありがとうございます。