正如@pjs 所指出的,我们可以使用拒绝采样(有关详细信息,请查看 wiki)。
这是这种方法的一种实现。
最重要的一步是找到一个分布 g,我们可以从中进行采样,并且它存在于 M 中,使得所有点的 M * g > f
f <- function(x) (25 * 200.7341^25 / x^26 * exp(-(200.7341/x)^25))
g <- function(x) dnorm(x, mean = 200.7341, sd = 40)
M <- 5
curve(f, 0, 500)
curve(M * g(x), 0, 500, add = TRUE, lty = "dashed")
现在,我们可以执行算法了
set.seed(42)
k <- 1
count <- 0
res <- vector(mode = "numeric", length = 1000)
while(k < 1001) {
z <- rnorm(n = 1, mean = 200.7341, sd = 40)
R <- f(z) / (M * g(z))
if (R > runif(1)) {
res[k] <- z
k <- k + 1
}
count <- count + 1
}
(accept_rate <- (k / count) * 100)
## [1] 19.7086
require(MASS) ## for truehist
truehist(res)
curve(f, 0, 250, add = TRUE)
录取率不是很高。您可以尝试找到更好的包络函数或使用 Metropolis Hasting 算法。