Hatena::Groupkakisute

g5nの書き殴り

2008-03-28

コンプリートできる確率と買う個数の期待値

 コンプリートできる確率と買う個数の期待値 - g5nの書き殴り を含むブックマーク はてなブックマーク -  コンプリートできる確率と買う個数の期待値 - g5nの書き殴り

http://d.hatena.ne.jp/m_seki/20080328#c 関連

# -*- coding: utf-8 -*-
require "rational"

def akb44(n)
  # n 枚買ってそろう確率
  omake(44, n, 44)
end

def omake(k,n,m=nil)
  # n 個買って k 種類のおまけのうち m 種類がそろう確率
  m = k if m.nil?
  omake_general(k,0,k,m,n)
end

def omake_general(k,a,b,m,n)
  # k 種類のおまけのうち、欲しいものが b 種類ある。
  # そして、すでに a 種類入手しているとする。
  # これから n 個のおかしを買い増ししたとき、
  # 手元に揃った種類数が m になる確率
  # http://aquarius10.cse.kyutech.ac.jp/~otabe/shokugan/
  comb(b-a, m-a) * sum(b-m, b-a){|i|
    (-1)**(b-m+i) * comb(m-a, m-b+i) * Rational(k-i, k)**n
  }
end

def comb(x,y)
  y = x - y if y > x/2
  return 0 if x < y
  return 1 if y == 0
  return 1 if x == 0
  (x-y+1..x).inject(:*)/(1..y).inject(:*)
end

def sum(x,y)
  (x..y).inject(0){|part,i| part + yield(i)}
end

def ex(k)
  # k 種類のおまけがすべてそろうまで買う個数の期待値
  # http://kakuritsu.hp.infoseek.co.jp/omake2.html
  sum(0, k-1){|i| Rational(k,k-i)}
end

if __FILE__ == $0
  # 44種類のおまけをコンプリートするまでに買う個数の期待値
  p ex(44).to_f

  # http://d.hatena.ne.jp/m_seki/20080328#c

  # > 12種類のカードが入ってるチョコを15個買って、11種類まであつまる確率
  p omake(12,15,11).to_f
  # > 44種類を45回でそろえる確率は、44回でそろえる確率の何倍か
  p akb44(45).to_f/akb44(44).to_f
end

ゲスト



トラックバック - http://kakisute.g.hatena.ne.jp/g5n/20080328