맨즈가 13장 모였을 때의 샹텐 수의 비율을 계산해 보았다

10411 단어 마작재료자바

맨즈가 13장 모였을 때의 샹텐 수의 비율을 계산해 보았다



라는 이유로 마작 재료 제3탄입니다.

이전 기사에서 생각한 것



마지막 기사는 여기

완전하게 랜덤으로 칭이트 대기 게임을 하면 의외로 템파이 하지 않게 된다고 생각했기 때문에 조사해 보았다!

에서



다만 단순히 보통으로 계산하면 재미있지 않기 때문에, 총치면 어떤 걸까・・・

흠...



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만년인가

오래 살지 않으면!

그 전에 서버가 망가지는가?

좋은 웹페이지 즐겨찾기