概要
麻雀の何切る問題において、打牌の受け入れ枚数、聴牌確率、和了確率、期待値を計算するアプリ「麻雀何切るシミュレーター」について紹介します。
麻雀何切るシミュレーター
麻雀何切るシミュレーター は、手牌を入力すると、以下の情報を計算するアプリです。
- 手牌が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件)
素晴らしいツールをありがとうございます!
いつも使わせてもらっています!
お願いがあるのですが、私はいつも三人打ちを打っているので是非三人麻雀にも対応してほしいのと、七対子との両天秤ができるようにして欲しいです。
よろしくお願いします。
コメントありがとうございます。気づくのが遅れてすみません。
向聴数の計算方法が一般手と七対子手で異なるため、実装上の問題で現在は別々になっているのですが、両方同時に計算できるようには対応したいと考えています。
3麻対応は、萬子2~8がないこと以外は4麻と変わらないので、対応は容易とは思います。
七対子の両天秤を計算できるようにする機能追加と不具合修正が済んで4麻バージョンが完成したら、3麻対応もしたいと思います。
聴牌確率が100%を超えるケースが存在するのはどういうことですか?
そもそもどんな手であれイーシャンテン以下の手が将来的に100%の確率で聴牌するということは直感的に考えてあり得ないと思うのですが
コメントありがとうございます。気づくのが遅れてしまいすみません。
一部の手牌 (例: 2345678m445p123s南) で聴牌率が101%など100%を超えるケースを確認しております。確率計算に1%前後の若干の不具合があるものと思われます。不具合の原因特定が難航しているのですが、分かり次第修正したいと考えています。
他ツール (一人麻雀計算機、ツモアガリ確認計算機) の計算結果と大きな隔たりはないことは確認しているのですが、101%など出てるケースでも真の値はおそらく99%など100%未満であることは確かです。
> そもそもどんな手であれイーシャンテン以下の手が将来的に100%の確率で聴牌するということは直感的に考えてあり得ないと思うのですが
ご指摘の通り、一向聴の時点で 100枚以上ある残り牌のいずれも有効牌という手牌はないと思うので、100%未満になることは確かかと思います。
Python初心者です。お手すきの際に、以下質問にご回答いただければ幸いです。
1.Pythonのスクレイピングで、麻雀何切るシミュレーターから情報を得ることは違法ではないでしょうか。
2.Pythonのrequestsモジュールで、麻雀何切るシミュレーターから情報を得ることは可能でしょうか。手牌を入力した際にURLが変わる、天鳳の牌理ツールなら可能かと思います。しかし、該当シミュレーターのように、手牌を入力してもURLが変わらないツールの場合にGETできるのかを教えていただきたいです。
コメントありがとうございます。
> 2.Pythonのrequestsモジュールで、麻雀何切るシミュレーターから情報を得ることは可能でしょうか。手牌を入力した際にURLが変わる、天鳳の牌理ツールなら可能かと思います。しかし、該当シミュレーターのように、手牌を入力してもURLが変わらないツールの場合にGETできるのかを教えていただきたいです。
すみませんが、現在は本ツールに GET メソッドによる API は用意していないです。
期待値の計算には、現在の手牌から和了りまでのすべての手牌の推移パターンを調べる必要があり、計算量が大きいです。そのため、「天鳳の牌理ツール」のように Javascript で書かれたコードをブラウザ側で実行する形式では実現が難しく、本ツールでは C++ で書かれた期待値計算ソフトをサーバー側に設置し、そこに POST メソッドで JSON 形式のリクエストを投げて、処理する形にしております。
> 1.Pythonのスクレイピングで、麻雀何切るシミュレーターから情報を得ることは違法ではないでしょうか。
申し訳ありませんが、レンタルサーバーの計算リソースがそこまで潤沢でないので、本ツールにプログラムで大量のリクエストを送ると、処理しきれなくなる可能性があります。そのため、Web 上に公開している本ツールの利用は人の手によるものに限定させてください。
なお、サーバー側に置いてある期待値計算ソフトは、ソースコードを GitHub 上に公開しています。
https://github.com/nekobean/mahjong-cpp
なんらかのプログラムで本ツールが出力する期待値計算の結果を利用したい場合は、そちらの環境にて期待値計算ソフトを起動し、リクエストを投げて利用する形なら可能です。
ソースからビルドするか、動作環境が Linux であれば以下にビルド済みのバイナリがあります。(./server)
https://github.com/nekobean/mahjong-cpp/tree/master/bin
期待値計算ソフトに投げるリクエストデータ及び返ってくるレスポンスデータの仕様は以下になります。requests モジュールのサンプルコードも記載しました。
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
ご返信いただきありがとうございます。
何分初心者で四苦八苦しながらですが、ご教示いただきました方法でサンプルコードの通り動作させることができました。とても丁寧に教えていただきありがとうございました。
上手くできたようでよかったです。
またなにかわからないことがあったら聞いてください。
期待値を計算できるOSSを探していたところ、こちらのOSSを見つけたためforkしました。
もとの実装では計算速度の観点からサーバーを分離されていたようですが、 emscriptenでwasmで計算することで対応できそうでしたので対応してみました。
emscripten対応により、以下のメリットがありそうです
– 静的コンテンツ以外を配信する必要がなくなる。
– C++サーバーが減る分脆弱性に強くなる。
– 実行がブラウザで行われる分、サーバーの計算資源を節約できる。
# emscripten対応し、jsで実行できるようにしたリポジトリ
https://github.com/Muratam/mahjong-cpp/
# ↑を使用することでブラウザonlyの動作で完結するようにしたリポジトリ
https://github.com/Muratam/mahjong-calculator
ここのコメント欄への返信は確認しませんので、何かありましたら twitter: @paradigm_9 までお願いします。
mahjong-nanikiru-simulator を改造し、各時点でどの程度正確な打牌ができているかを確認するサイトを作ってみました。
https://sagisawa.0am.jp/akochandaaaaa/
To: Muratam さん
コメントありがとうございます。
> もとの実装では計算速度の観点からサーバーを分離されていたようですが、 emscriptenでwasmで計算することで対応できそうでしたので対応してみました。
Javascript だと速度的に厳しいかと思っていたのですが、wasm なら結構高速に動作するのですね。現在は計算リクエストが1日に500前後なのでサーバー側でも対応できるのですが、アクセスが増えてきたら、クライアント側で実行してもらう仕組みとして参考にさせていただきたいと思います。
> mahjong-nanikiru-simulator を改造し、各時点でどの程度正確な打牌ができているかを確認するサイトを作ってみました。
GitHub に置いてたライブラリはドキュメントも整備していなかったのに、素晴らしいものを作ってくださりありがとうございます。試してみましたが、牌効率の勉強になってよいですね。自摸のみだと和了るのはなかなか難しいようです。
一人麻雀計算機が赤ドラに対応しておらず不便を感じていたところにこのシミュレーターを見つけました。
非常に助かります、ありがとうございます!
シミュレーターが起動しないので報告です
Failed to load resource: the server responded with a status of 500 ()
サーバー側のアプリケーションが落ちていたので、起動しました。
報告していただきありがとうございます。
素晴らしいツールありがとうございます。
(初心者向けに自分で作成した何切るや、巷の何切るに活用させて頂いております。他にも気になった牌姿があったらとりあえずこれで検証するのを積み重ねることで、期待値の差の大きさを知ることができるというのがとても便利です。)
要望ですが、何切る作成の為に下記画像のような牌姿を出力する機能が欲しいです。
https://i.imgur.com/lOo1vv3.png
御一考お願いします。
コメントありがとうございます。
手牌入力後に「何切る問題を作成」の欄の「画像を保存する」ボタンをクリックすることで牌姿を画像で保存できるようにしました。
PC のブラウザでは動作すると思います。
(スマホでは iOS 版の Chrome など一部のブラウザでダウンロードが上手くいかないので原因がわかったら修正します。)
動きで少し気になった所があったので質問です。
12455m34567p6777sの手牌(手牌以外はすべてデフォ状態)
上記の場合、12mの辺張落とすのに3m引きも見て1mから…と思ったのですが、
計算では2m切りで向聴戻しした方が期待値・和了確率共に高いと出ました。
2m切りの方が良い理由が自分では思い当たらなかったので、気になった次第です。
(麻雀は下手なので見当違いでしたら申し訳ないです)
コメントありがとうございます。
おっしゃる通り、私も1mから落とすほうが和了確率、期待値共に高くなりそうに思えるので、なぜそのような結果になったのか不具合の有無も含めて調査します。
ちなみに、他のシミュレーターでは以下のような結果になりました。
東一局0本場 東家 3巡目 ドラ: 南
12455m34567p6777s
ツモアガリ確率計算機 http://critter.sakura.ne.jp/agari_keisan.html
1m 2840 48.30%
2m 2755.3 46.60%
5m 2603.1 43.71%
一人麻雀練習機 http://ara.moo.jp/mjhmr/
1m 4463.45 48.93%
2m 4326.82 46.26%
5m 4176.68 44.17%
こんにちは
シミュレーターを使用させていただいています
2つ程欲しい機能があったのでコメントさせていただきます
1.ダマテンにした場合の、待ちの良くなる受け入れの表示
2.聴牌時の、それぞれの和了における役の一覧表示
ご一考いただけると嬉しいです
コメントありがとうございます。
1.ダマテンにした場合の、待ちの良くなる受け入れの表示
2.聴牌時の、それぞれの和了における役の一覧表示
内部的には。聴牌している手牌から考え得る和了形や手変わりのパターンはすべてシミュレーションしているのですが、表示するには情報量が多くなってしまうため、結果出力画面の UI をどのようにするか検討したいと思います。
便利なツールを公開していただきありがとうございます。
残り枚数が減った状態のシミュレーションをしたいのですが、可能でしょうか?
To: YYさん
コメントありがとうございます。
現在は手牌やドラ表示牌に使われている牌以外の牌はすべて牌が残っているものとして計算しており、個別に残り枚数を設定する機能はありません。
残り牌を個別に設定する機能追加は、計算シミュレーター側の対応は容易ですが、34種類の残り枚数の入力フォームを Web ページの用意する必要があるので、スペース的に難しいかもしれません。
別画面で残り枚数の設定画面を表示できるようにするなど、対応を検討したいと思います。
バージョン 0.9.0 (2021/11/07) にて残り牌の設定機能を追加しました
素早い対応ありがとうございます!