知恵袋の男女が並ぶ確率の問題をJavaで解いてみた。

 知恵袋の男女が並ぶ確率の問題Javaで解いてみました。(^_^;

 男子4人女子3人を1列に並べるとき次の事象の確率を求めよ
1、男女が交互に並ぶ
2、女子3人が隣り合う
3、女子が両端にくる
4、女子3人のうちどの2りも隣り合わない

 今回は確率なので全順列もカウントして、結果はそれぞれ最大公約数を求めて約分しました。(^_^;
 ちなみに、{男女が交互に並ぶ}とは、{男子のうちどの二人も隣り合わない}∧{女子のうちどの二人も隣り合わない}ということですね。(^_^;

● Danjo3.java

/*
 * Danjo3.java
 * 
 */

class Danjo3 {
    static boolean nextPerm(char[] p, int n, int r) {
        int i, j;
        char t;
        
        if(r <= 0 || n < r) return(false);
        for(i = r + 1; i <= n-1; i++)
            for(j = i; j >= r + 1 && p[j-1] < p[j]; j--){
                t = p[j]; p[j] = p[j-1]; p[j-1] = t;    // swap(p,j,j-1);
            }
        for(i = n - 1; i > 0 && p[i-1] >= p[i]; i--);
        if(i==0) return(false);
        for(j = n - 1; j > i && p[i-1] >= p[j]; j--);
        t = p[j]; p[j] = p[i-1]; p[i-1] = t;            // swap(p,j,i-1);
        for(j=n-1; i< j; i++, j--){
            t = p[i]; p[i] = p[j]; p[j] = t;            // swap(p,i,j);
        }
        return(true);
    }
    
    static int gcd(int a, int b){
        return( b == 0 ? a : gcd(b, a % b) );
    }
    
    public static void main(String[] args) {
        final String P = "ABCDabc";     // 男を大文字、女を小文字で表す
        char[] p = P.toCharArray();     // 順列生成用
        int n = p.length;
        
        long tm = System.nanoTime();    // Timer Start
        int[] count = { 0, 0, 0, 0, 0};
        
        do{
            String s = new String(p);
            s+="|";                     // 端
            for(int i=0; i< n; i++)     // 順列の横に男女表を作成
                s+=(Character.isUpperCase(p[i]) ? "男" : "女");
            s+="|";
            count[0]++;                 // 全順列をカウント
            if(!s.contains("男男") && !s.contains("女女")) count[1]++;
            if( s.contains("女女女")) count[2]++;
            if( s.contains("|女")  &&  s.contains("女|") ) count[3]++;
            if(!s.contains("女女"))   count[4]++;
            //System.out.println(s);
        }while(nextPerm(p,n,n));
        for(int i=1; i< count.length; i++){
            int g = gcd(count[0],count[i]);
            System.out.printf("(%d) %d / %d = %d / %d\n",i,
                count[i], count[0], count[i]/g, count[0]/g);
        }
        tm=System.nanoTime()-tm;        // Timer Stop
        System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9);
    }
}

●実行結果

(1) 144 / 5040 = 1 / 35
(2) 720 / 5040 = 1 / 7
(3) 720 / 5040 = 1 / 7
(4) 1440 / 5040 = 2 / 7
Runtime : 0.051 [sec]

※参考URL
http://www.geocities.jp/m_hiroi/java/abcjava04.html

知恵袋の男女が並ぶ場合の数の問題をJavaで解いてみた。
知恵袋の男女が並ぶ場合の数の問題をJavaで解いてみた。(2)

スッキリわかるJava入門 第2版 (スッキリシリーズ)

スッキリわかるJava入門 第2版 (スッキリシリーズ)

わかりやすいJava入門編

わかりやすいJava入門編

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング (impress top gear)

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング (impress top gear)