1

下面的 R 代码只给了我正态分布的一半;为了得到另一半,我应该对代码进行什么更改?

halfnormal <- function(n){
    vector <- rep(0,n)
    for(i in 1:n){
        uni_random <- runif(2) 
        y <- -log(uni_random)
        while(y[2] < (y[1]-1)^2/2){
            uni_random <- runif(2)
            y <- -log(uni_random)
        }
        vector[i] <- y[1]
    }
    vector
}

output <- halfnormal(1000)
hist(output)
4

2 回答 2

7

如果您坚持使用该代码生成标准法线(不推荐,因为rnorm这样会更快更准确),只需将整个向量与由随机(-1, +1)值组成的等长向量点积即可。

顺便说一句,半正态分布也称为Chi 分布(自由度为 1)。

于 2013-03-01T06:24:41.440 回答
1

这看起来有点像带有 Marsaglia 修改的 Ziggurat 算法,但有点不同?如果您不想在 R 中使用任何保证工作的随机数生成器,也许这可行:

   halfnormal <- function(n){
        vector <- rep(0,n)
        for(i in 1:n){
            uni_random <- runif(2) 
            y <- -log(uni_random)
            while(y[2] < (y[1]-1)^2/2){
                uni_random <- runif(2)
                y <- -log(uni_random)
            }
            vector[i] <- sample(c(-1,1),size=1)*y[1] #randomly select the tail
        }
        vector
    }

    output <- halfnormal(1000)
    hist(output)
于 2013-03-01T06:21:00.643 回答