概要
麻雀の何切る問題において、打牌の受け入れ枚数、聴牌確率、和了確率、期待値を計算するアプリ「麻雀何切るシミュレーター」について紹介します。
麻雀何切るシミュレーター
麻雀何切るシミュレーター は、手牌を入力すると、以下の情報を計算するアプリです。
- 手牌が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 切りで三色を狙いましょう。
まとめ
概ね、人間が考える打牌と同じ結果がコンピューターの計算でも得られることが確認できました。
コメント
コメント一覧 (84件)
いつも大変役立てております
一般手と七対子手の天秤をかけるようにしてほしいです!
利用いただきありがとうございます。
半年ほどしばらく更新できておらず申し訳ないですが、時間がとれたら検討したいと思います。
issue に登録しました
https://github.com/nekobean/mahjong-cpp/issues/13
2024/11/22 対応済み
こんにちは。
麻雀何切るシミュレーターをいつも使用させていただいています。
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
向聴戻しや手変わり次第で聴牌確率が逆転することを考慮できておりませんでした。お手数をおかけしました。
ご回答いただきありがとうございます。
素晴らしいツールをいつも使用させていただき、ありがとうございます。
贅沢なお願いではありますが、
序盤におけるシャンテン数戻しについて、
良形変化およびその枚数を抽出していただけると、より参考になると思いました。
例えば、4567p 4567sの4連形2つのヘッドあり一向聴について、
両面聴牌の3658p、3658sと
カンチャン聴牌の29p、29sが区別されているととても助かります。
コメントありがとうございます。
何切るシミュレーターのほうをしばらく更新できておらず、すみません。
時間がとれた際にアップデートしたいと思いますので、その際の参考にさせていただきます。
貴重なご意見ありがとうございます。
いつもありがたく使わせていただいております。
シミュレーターをYouTubeの解説動画にて商用利用することは可能でしょうか?
コメントありがとうございます。
画像やシミュレーション結果は自由にご利用いただいて大丈夫です。
計算結果は、ツモ切りのみの一人麻雀を仮定して算出しているため、実際の麻雀での正着とは異なる場合があります。
何切るシミュレーターのページの Q&A の欄にも制約を記載していますので、そちらもご確認の上、あくまで参考程度にご活用いただければと思います。
お忙しいところ失礼いたします。
東1局親1巡目、123678m345p2278s東(ドラ表示南)という牌姿において、これは明らかに東を切って即リーをする牌姿ではありますが、ダブルリーチをONにしたときの期待値は4908点、OFFにしたときの期待値は4601点となり、300点ほどの差しかありません。実際、この手牌はダブルリーチピンフツモで7800点、リーチピンフツモの場合は3900点ですが、和了率が71.37%であることから、裏ドラを抜きにしても7800*0.7137=5566>4908となり、矛盾しているように思います。(一方でダブルリーチなしの方は裏が絡むと7700や12000になることを考えると、概ね正しいように思えます。)
これについて、検証をお願いできればと思います、よろしくお願いいたします。
ご利用いただきありがとうございます。
シミュレーターについていくつか問い合わせいただいているのですが、しばらく放置したままとなっており、申し訳ないです。
すぐには原因がわからないかもしれませんが、コメントいただいた手牌について、ダブルリーチ判定の処理について問題がないか調査してみます。
issue に登録しました 調査までしばらくお時間いただきます
https://github.com/nekobean/mahjong-cpp/issues/11
東場南家 34678m678p22s白 明順子345pドラ表示1s (赤5全切れ)
において、白切りの期待値が3223点、和了確率が55.69%となっていました。手替わりが全くない(たとえば2sを引いたときでも2s切りなので)ため、期待値は4000×0.5569=2228点になると思います。もしよろしければ検証をよろしくお願いします。
返信が遅くなりすみません。
時間がとれずしばらく更新できていないのですが、今度検証してみようと思います。
コメントありがとうございます。
毎日のように何切るシミュレータを使っていて、いつも助かっています。計算過程について質問があります。
このツイートとそれに連なるリプライを見ていただければわかるのですが、13枚形のシミュレーションに違和感があります。https://x.com/madopyi/status/1713053065761493048?s=20
通常の選択での14枚と13枚を比較すると巡目が1巡違うことに従った結果が出ます。
ただ、聴牌率 和了率 期待値において14枚<シャンテン戻し13枚
となる逆転現象が起こっていて、この原因は計算過程における手替わりの考慮にあると思っていて、実際14枚形と13枚形どちらを採用すればよいのでしょうか?
返信が遅くなりすみません。
いつもご利用いただきありがとうございます。
週末確認してみます。
結構シミュの根幹部分だと思うので、すごく気になります!お待ちしてます。
遅くなりすみません。ツイート拝見しました。
14枚の手牌での期待値の優越が13枚でシミュレーションした場合は逆転するということですね。
issue に登録しました。
https://github.com/nekobean/mahjong-cpp/issues/8
https://github.com/nekobean/mahjong-cpp/issues/10
これまでもいろいろご指摘いただいていたものの 2年ほど更新できていなかったのですが、開発再開しようと思うので、しばらくお時間ください。
今後ともよろしくお願いします。
I’m
上はミスです
要望にはなりますが、三人麻雀用に2〜8mを自動で0枚に設定するボタン、もしくはシミュレーション状況を保存できるようになるととても助かります
ご検討よろしくお願いします。
コメントありがとうございます。
ToDo に登録しました。
https://github.com/nekobean/mahjong-cpp/issues/9
しばらく時間がかかるかもしれませんが、対応できるか検討したいと思います。
突然のご連絡失礼いたします。
私、BSジャパネクスト「麻雀オールスターJapanextCUP」を
担当しております厨子王株式会社の藤木と申します。
今回、麻雀何切るシミュレーター version 0.9.0を当番組の対局時にドラ表示やテンパイ時の待ち牌表示を効率化する為に使わせて頂きたくご連絡いたしました。
シミュレーターは
2024年5月19日放送回からの使用を予定しております。
突然のご相談恐縮ですがご検討いただけたらと思います。
よろしくお願いいたします。
藤木様
ご連絡いただきありがとうございます。
本ツールですが、自由にご利用いただいて大丈夫です。
待ち牌表示に関しては、「今の手牌から向聴数を1つ下げる牌の候補」と定義が明確であるため正確です。
一方、期待値や和了確率等は、ツモ切りのみの一人麻雀を仮定して算出しているため、実際の麻雀での正着とは異なる場合がございますので、参考にされる場合は、ご留意ください。
何切るシミュレーターのページの Q&A の欄にも注意点等を記載しております。
なにかご不明な点がございましたら、お知らせください。
以上、よろしくお願いいたします。
コメント失礼します。
私はIT系の専門学校に通う学生なのですが、現在学校の授業の課題で個人制作をしております。私が作るものは「麻雀リアルタイムシミュレーター」といい、麻雀ゲーム「雀魂」のウィンドウをリアルタイムでキャプチャし、ゲーム画面から物体検知で手牌情報を含めた必要な対戦情報を取得し、GitHubに公開されてる何切るシミュレーターのソースコードに取得情報を渡し結果を表示するデスクトップアプリです。
開発言語はPythonをメインにして、ElectronとFlaskを使っています。
現在キャプチャリングと対戦情報の取得まで完成しているのですが、pythonから何切るシミュレーターのソースコードにデータを渡す部分の制作に躓いています。もしよろしければ、何か助言をいただけると幸いです。
それと、私はC言語系は全く触ったことがなくこの個人制作を機に最近少し勉強しはじめてる程度の知識しかないです。
コメントありがとうございます。
C++で書かれたコードをPythonから呼び出すインターフェイスを作るには、以下のようなライブラリを使用してラッパーを作る必要があります。
– pybind11
– Boost.Python
なお、現在の mahjong-cpp に Python から import して使えるインターフェイスがまだ用意できておりません。
(他の言語から呼び出せるように対応したいとは考えておりますが、最近更新できておらずすぐに対応できないかもです)
HTTPリクエストでJSONでやり取りするインターフェイスは既にありますので、その方法でもよろしければ、Python からお使いいただけます。
以下にサンプルコードとビルド済みのバイナリ(exe)を追加しましたので、よろしければご参照ください。
https://github.com/nekobean/mahjong-cpp/tree/master/python_sample
もしご不明が点やご要望がありましたら、お知らせください。
お忙しい中サンプルコードまで追加していただきありがとうございます。参考にさせていただきます。
こんにちは
松原翔です。
この前の学校の課題の件ありがとうございました。おかげでアプリとしての最低限のサイクルが完成しました。本当に感謝しかないです。
コメントありがとうございます。
お役に立ててよかったです。