并没有更多分布的限制条件了,那么自由发挥一下:最小30,最大87,平均数60,个数268。这意味着去掉最大最小各一个之后,剩下266个数的总和是确定的。先在30到87之间生成265个,再根据总和计算到剩下最后一个。
x1 <- runif(265, min = 30, max = 87)
x2 <- 60 * 268 - 30 - 87 - sum(x1)
x2_final <- x2
x2
显然有可能不在30到87范围内,那么根据它到底偏小还是偏大进行调整。例如:若x2
偏小,即低于30,那么不断从x1
中取一个数出来,在保证这个取出来的数不会最终低于30的前提下,将其减小;并将对应减小的部分加到x2
上(从而保证总和不变),直到x2
落入30到87的范围。
if(x2 < 30){
while (x2_final < 30) {
idx <- sample.int(265, size = 1)
full_amt <- min(87 - x2_final, x1[idx] - 30)
amt <- runif(1, min = 0, max = full_amt)
x2_final <- x2_final + amt
x1[idx] <- x1[idx] - amt
}
}
对于x2
偏大的情况也可以类似处理:
if(x2 > 87){
while (x2_final > 87) {
idx <- sample.int(265, size = 1)
full_amt <- min(x2_final - 30, 87 - x1[idx])
amt <- runif(1, min = 0, max = full_amt)
x2_final <- x2_final - amt
x1[idx] <- x1[idx] + amt
}
}
于是最终得到
x_final <- c(30, 87, x1, x2_final)
length(x_final)
summary(x_final)