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