既知の CDF がある離散乱数をすばやく生成したいと考えています。基本的に、アルゴリズムは次のとおりです。
- CDF ベクトルを作成します (0 から始まり 1 で終わる増加するベクトル)
cdf - 一様 (0, 1) 乱数を生成する
u- 選ぶなら
u < cdf[1]1 - それ以外の場合
u < cdf[2]は 2 を選択 - それ以外の場合
u < cdf[3]は 3 *...
- 選ぶなら
例
最初に cdf を生成します。
cdf = cumsum(runif(10000, 0, 0.1))
cdf = cdf/max(cdf)
次にN一様乱数を生成します。
N = 1000
u = runif(N)
値をサンプリングします。
##With some experimenting this seemed to be very quick
##However, with N = 100000 we run out of memory
##N = 10^6 would be a reasonable maximum to cope with
colSums(sapply(u, ">", cdf))