知恵袋の白玉と赤玉の原因の確率の問題をJavaで解いてみました。(^_^;
白玉7個、赤玉3個が入っている袋から、玉を1個取り出し、それを袋に戻さないで、続いてもう1個取り出す。2番目に取り出した玉が赤玉であるとき、最初に取り出した玉も赤玉である確率を求めよ。
確率の問題では見た目が同じものでも区別して考えるので、次のように玉に番号を与えて、その番号を7で割った商でそれぞれの色を得ることにします。
白玉(0): 0,1,2,3,4,5,6,
赤玉(1): 7,8,9
ちなみに、「原因の確率」とは、時間的に逆行する条件付き確率のことらしい。
● WRCondProb1.java
/* * WRCondProb1.java * * N=10, R=2 * 白玉(0): 0,1,2,3,4,5,6 * 赤玉(1): 7,8,9 * * 7で割った商で色を得る */ public class WRCondProb1 { // 順列生成 static boolean nextPerm(int[] p, int n, int r) { int i, j; int 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 int N = 10, R = 2; int total = 0, count = 0; int[] p = new int[N]; for(int i = 0; i< 10; i++) p[i] = i; long tm=System.nanoTime(); // Timer Start do{ if(p[1]/7==1) { total++; if(p[0]/7==1) count++; } }while(nextPerm(p,N,R)); int g = (count*total!=0) ? gcd(count,total) : 1; System.out.printf("%d / %d = %d / %d\n", count, total, count/g, total/g); tm=System.nanoTime()-tm; // Timer Stop System.out.printf("Runtime : %.3f [sec]\n",(double)tm/1e9); } }
●実行結果
6 / 27 = 2 / 9 Runtime : 0.023 [sec]
※参考URL
●条件付き確率
●条件付き確率の意味といろんな例題 | 高校数学の美しい物語
●原因の確率(時間的に逆行する条件付き確率) | 受験の月
- 作者: 中山清喬,国本大悟
- 出版社/メーカー: インプレス
- 発売日: 2014/08/07
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (19件) を見る
スッキリわかる Java入門 実践編 第2版 (スッキリシリーズ)
- 作者: 中山清喬
- 出版社/メーカー: インプレス
- 発売日: 2014/09/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (7件) を見る