北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

超幾何分布と二項分布

非復元抽出とは、有限個のものから複数個を抽出する際に、抽出したものを戻さずに2回目以降の抽出を行うこと。こうすると二回目以降の試行の確率はだんだんと変化していくことになる。

復元抽出する場合は二項分布となるが、非復元抽出をすると超幾何分布となる。が、全体数に比べて試行回数が十分に小さい場合は、非復元抽出を二項分布で近似できる。

試しに、白玉100個、赤玉900個から玉を取り出す試行を10回行う場合に白玉が二個以下である確率を求めてみると、二項分布でも超幾何分布でも同じ値になることが分かる。

---*snip*---

def hypergeometricDistribution(
  n: Int, N: BigInt, Np: BigInt
): (Int) => Double = {
  import scala.math.pow
  def distribution(x: Int): Double =
    (combi(Np, x) * combi(N - Np, n - x)).toDouble / combi(N, n).toDouble
  distribution _
}

val n = 10
val N = 1000
val p = 0.1
val binomial = binomialDistribution(n, p)
val hypergeometric = hypergeometricDistribution(n, N, (N.toDouble * p).toInt)

println("hypergeometric: %.2f" format ((0 to 2).map {hypergeometric(_)}.sum))
println("binomial: %.2f"       format ((0 to 2).map {binomial(_)      }.sum))
hypergeometric: 0.93
binomial: 0.93