1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

マンズが13枚そろった時のシャンテン数の割合を計算してみた

Last updated at Posted at 2016-01-15

マンズが13枚そろった時のシャンテン数の割合を計算してみた

という訳で麻雀ネタ第三弾です。

前回の記事で思ったこと

前回の記事はこちら

完全にランダムでチンイツ待ち当てゲームをやると意外とテンパイしてないなって思ったんで調べてみた!

ただ単に普通に計算したら面白くないので、総当たりしたらどんなもんかな・・・と

ふむ・・・

無題.pngか・・・

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枚を選ぶ組み合わせは上記のとおり無題.png

その組み合わせを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なんてあるが本当かよ!そんなに上がれるなんて信じられない!

総あたりで調べてやんぜ!!!!

無題2.png

・・・

・・・・・・

・・・・・・・・・

このまま計算したら約250万年かー

長生きしないとね!

その前にサーバがぶっ壊れるか

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?