我想快速生成離散隨機數,我有一個已知的CDF。本質上,該算法是:高效地生成離散隨機數
- 構建CDF矢量(0,1)隨機數
u
- 如果
u < cdf[1]
選擇(從0開始以1增加矢量和結束)cdf
- 產生均勻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))
而作爲「如果替換爲真,則使用沃克的別名法(裏普利,1987年)時,有超過250個合理可能的值」,它是有效的時間複雜度是O(n)的 – colinfang 2013-11-21 14:52:21