というわけで解決編。
例の式は何を表しているのか、完全に把握しました。
// いろんなとこに載ってる計算式 "初期手札にn枚の確率" = nCm(card, n) * nCm(deck - card, draw - n) / nCm(deck, draw); // 分解して見ると A = "投入枚数のうち、n枚を選び取った時の組み合わせ" = nCm(card, n); // これにより、手札の中に欲しいカードが何枚あるのか既に決定しています。つまりn枚。 B = "残りの手札の組み合わせ" = nCm(deck - card, draw - n); // 手札からn枚を除いた、つまり意識していないカードの組み合わせを計算します。 // この引数をx,yと置いたとき、上の式はnCm(deck - x, draw - y)となり相互互換です。 C = "手札の組み合わせ" = nCm(deck, draw); // 言うまでも無くデッキからdraw枚を引いたとき、その手札の組み合わせ。 "手札に希望カードがn枚あるときの手札組み合わせ" = A * B; "その組み合わせを全体の組み合わせで割る" = A * B / C; よ=っ=て = "初期手札にn枚だけ存在する確率" = nCm(card, n) * nCm(deck - card, draw - n) / nCm(deck, draw); // 応用もあるでよ // 手札に必要枚以上、投入枚数以下ある時の確率 // 投入枚数までの各"手札存在枚数"を足すことで計算できるんだなも。 more = "必要枚数"; for(int cnt = more; cnt < card; cnt++) sum += nCm(card, cnt) * nCm(deck - card, draw - cnt) / nCm(deck, draw); // さらにっ for(int cnt1 = more1; cnt1 < card1; cnt1++) for(int cnt2 = more2; cnt2 < card2; cnt2++) sum += nCm(card1, cnt1) * nCm(card2, cnt2) * nCm(deck - card1 - card2, draw - cnt1 - cnt2) / nCm(deck, draw); // というのもおそらく可能。 // なにやってるかっつーと、異なる種類のカードがそれぞれ手札にn枚あるときの確率。このループでは2種類。 // カイバーマンはあるけどブルーアイズがない!っていう確率がわかるぴょん。
結論:nCmを発明した奴は頭が3つある。