r - 有效地生成离散随机数

标签 r random memory-efficient

我想在已知 CDF 的情况下快速生成离散随机数。本质上,算法是:

  1. 构造 CDF 向量(从 0 开始到 1 结束的递增向量)cdf
  2. 生成一个统一的(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/

相关文章:

r - 重复值子集 >10

r - 在 R 中使用移动平均线

java - 使用数字数组来调整特定返回值的机会?

c++ - 对于以下用途,vector 和 deque 之间最有效的是什么?

c++ - 存储视频数据的最有效方式

performance - 面向对象,数据方向,缓存污染和缓存明显性

r - 在 R 中选择列

r - 仅针对重要的拟合绘制 geom_smooth

c++ - 重新初始化随机分布

linux - 我可以在没有硬件生成器的情况下使用 rng-daemon 来增加 linux 熵吗?