既知の 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))