CDF 很容易反转。 反演公式导致必须是最简单和最方便的可能解决方案之一。
首先观察结果的成正比。因此,如果我们在和 _{\ max }=\ sum_ =,我们只需要找到最大的k0≤k≤ne−bkq0qmax=∑nk=0e−bk(1−e−b(n+1))/(1−e−b)k
q≥∑i=0ke−bi=1−e−(k+1)b1−e−b.
简单代数给出了解决方案
k=−ceiling(log(1−q(1−e−b))b).
这是一个与所有其他随机数生成器一样构造的R
实现:它的第一个参数指定要生成多少个iid值,其余参数命名参数( as和 as ):bb
nn.max
rgeom.truncated <- function(n=1, b, n.max) {
a <- 1 - exp(-b)
q.max <- (1 - exp(-b*(n.max+1))) / a
q <- runif(n, 0, q.max)
return(-ceiling(log(1 - q*a) / b))
}
作为其使用示例,让我们根据此分布生成一百万个随机变量:
b <- 0.001
n.max <- 3500
n.sim <- 10^6
set.seed(17)
system.time(sim <- rgeom.truncated(n.sim, b,n.max))
(秒。)0.10
h <- hist(sim+1, probability=TRUE, breaks=50, xlab="Outcome+1")
pmf <- exp(-b * (0: n.max)); pmf <- pmf / sum(pmf)
lines(0:n.max, pmf, col="Red", lwd=2)

(添加到每个值以创建更好的直方图:的过程有一个特质(=错误),其中当左端点设置为零时,第一个条形太高。)红色曲线是参考分布这个模拟试图重现。让我们用卡方检验评估拟合优度:1R
hist
observed <- table(sim)
expected <- n.sim * pmf
chi.square <- (observed-expected)^2 / expected
pchisq(sum(chi.square), n.max, lower.tail=FALSE)
p 值为:非常合适。0.84