我想在已知 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))
最佳答案
如果你知道概率质量函数(如果你知道累积分布函数,你会这样做),你可以使用 R 的内置 sample
函数,你可以在其中定义离散事件的概率带参数 prob
.
cdf = cumsum(runif(10000, 0, 0.1))
cdf = cdf/max(cdf)
system.time(sample(size=1e6,x=1:10000,prob=c(cdf[1],diff(cdf)),replace=TRUE))
user system elapsed
0.01 0.00 0.02
关于r - 有效地生成离散随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15137459/