Rubyで多項分布からのサンプリング

多項分布を扱うことがあったので、Rubyでサクッと多項分布からのサンプリングを書いてみた。ただし、何も見ずにカンで書いたので合ってるかどうかはまったく保証しません。

#!/usr/bin/ruby
# 多項分布からのサンプリングを行う関数
# probは、各項の確率(総和は1とする)
def samplingFromMultinomialDistribution(prob)
# 累積確率にする
prev=0.0
accprob=prob.map{|x| prev=prev+x }
# 一様乱数生成
r=rand()
# 要素を選択する
return accprob.index{|v| v > r}
end
# 適当な多項分布
p prob=[0.6,0.2,0.1,0.05,0.04,0.01]
# サンプリングして
index=samplingFromMultinomialDistribution(prob)
# その項を出力する
p index

何回か実行してみたけど、それっぽい結果が出ているのでよしとするか…。今回は厳密さとか全くいらないので。
厳密さが要求されるシーンで多項分布を扱っている方々はどんなふうにサンプリングしているのだろう?

コメントする