有点晚了,但这里的函数是通过 a、b、... 向量化的
runifMean <- function(n, length, xmin, xmax){
m <- matrix(0, nrow = n, ncol = length)
m[, 1] <- runif(n, -1, 1)
summ <- m[, 1]
for(i in 2:(length - 1)){
m[, i] <- -runif(n)*sign(summ)
summ <- summ + m[, i]
}
m[, length] <- -summ
return(m*(xmax - xmin)/2 + (xmax + xmin)/2)
}
它返回一个包含n 行和length 列的矩阵。每行都有介于xmin 和xmax 之间的随机值,平均值为(xmax - xmin)/2。
set.seed(123)
v <- rep(runif(4), each = 5) # original vector
vR <- v*as.vector(t(runifMean(4, 5, 0.99, 1.01))) # with random perturbations
# check that the means from vR equal the original values from v
rowMeans(matrix(vR, nrow = 4, byrow = TRUE)) == v[seq(by = 5, length.out = 4)]
[1] TRUE TRUE TRUE TRUE