マンズが13枚そろった時のシャンテン数の割合を計算してみた
という訳で麻雀ネタ第三弾です。
前回の記事で思ったこと
前回の記事はこちら
完全にランダムでチンイツ待ち当てゲームをやると意外とテンパイしてないなって思ったんで調べてみた!
で
ただ単に普通に計算したら面白くないので、総当たりしたらどんなもんかな・・・と
ふむ・・・
2,310,789,600件・・・
よしやろう!
という訳で
結果は
テンパイ:1,106,193,760件(約47.9%)
1シャンテン:1,190,253,600件(約51.5%)
2シャンテン:14,342,240件(約0.6%)
でした。
なお、かかった時間は197,004秒・・・
うん、たった二日チョイやな!
やったこと
1マン~9マンまで各4牌、の計36牌のうち13枚を選ぶ組み合わせは上記のとおり
その組み合わせをwhile文でまわしながら全通り作ります。(ちなみになーんもググらずに自分で考えて適当に書いたんでスマートな書き方かどうかは知らない!
//コードから抜粋して整理
Integer check_hai = 36;
Integer pickup_num = 13;
HashMap<Integer,Integer>before_info = new HashMap<Integer,Integer>();
HashMap<Integer,Integer>start_lists = new HashMap<Integer,Integer>();
for (int i = 1 ; i <= pickup_num ; i++){
start_lists.put(i, i);
}
//ここでシャンテン判定
Integer check = check(haipai, start_lists, pickup_num, 0L);
before_info = start_lists;
Long count = 0L;
while(true) {
//末端の数字が最大値でないなら末端の数字を+1する
if (before_info.get(pickup_num) != check_hai) {
HashMap<Integer,Integer>now_info = new HashMap<Integer,Integer>();
now_info = before_info;
now_info.put(pickup_num, now_info.get(pickup_num) + 1);
//ここでシャンテン判定
before_info = now_info;
} else {
//何桁目までがmaxか調べる
Integer max_keta = null;
for (int j = pickup_num; j >= 1; j--) {
if (before_info.get(j) != check_hai - pickup_num + j) {
max_keta = j + 1;
//for文のbreak;
break;
}
}
if (max_keta == null){
//while文のbreak;
break;
}
HashMap<Integer,Integer>now_info = new HashMap<Integer,Integer>();
now_info = before_info;
//maxでない桁をチェックしてその桁を+1
now_info.put(max_keta - 1, now_info.get(max_keta - 1) + 1);
Integer kijun_num = now_info.get(max_keta - 1);
//以降の桁はkijun_numに+1ずつした値
for (int m = max_keta;m <= pickup_num;m++){
kijun_num++;
now_info.put(m, kijun_num);
}
//ここでシャンテン判定
before_info = now_info;
}
}
これさえ出来れば後は、以前のコードを使いまわしたら完成ですね!
感想とか
とりあえず普通に数値をInteger型で書いて実行してたら、途中でLong型じゃないとだめなことに気づいた!
あと、普通にLong型で値入れるときは後ろにLを入れないと動かないことに驚愕・・・。
PHPこんなこと気にしなくていいのに・・・
そして同じ環境でPHPだと絶対に二日じゃ終わらない自信がある!
次のネタ・・・?
とりあえず天和の確率は33万分の1なんてあるが本当かよ!そんなに上がれるなんて信じられない!
総あたりで調べてやんぜ!!!!
・・・
・・・・・・
・・・・・・・・・
このまま計算したら約250万年かー
長生きしないとね!
その前にサーバがぶっ壊れるか