使用接受拒绝方法生成正态分布的另一半

时间:2013-03-01 06:00:27

标签: r statistics random-sample

以下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)

2 个答案:

答案 0 :(得分:7)

如果您坚持使用该代码生成标准法线(不推荐,因为rnorm会更快更准确),只需将整个矢量乘以由随机{等长矢量组成的整数矢量{1}}值。

顺便说一下,半正常也被称为Chi distribution(1自由度)。

答案 1 :(得分:1)

这看起来有点像Zaggurat算法和Marsaglia的修改,但它有点不同?如果您不想在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)