我将如何有效地采用值1:n的1-by-1递增随机样本,确保每个随机采样值始终高于 以前的值?
e.g:
对于值1:100,得到一个随机数,比如61.(当前列表= 61)
然后选择62到100之间的另一个数字,比如说是90(当前列表= 61,90)
然后选择91到100之间的另一个数字,比如说是100 在达到最大值时停止该过程(最终列表= 61,90,100)
我一直陷入困境,以这种笨重的方式思考:
a1 <- sample(1:100,1)
if(a1 < 100) {
a2 <- sample((a+1):100,1)
}
etc etc...
我想报告最终的矢量是a1,a2,a(n)的串联:
result <- c(a1,a2)
即使这听起来像是一个家庭作业问题,但事实并非如此。我很幸运地离开了很多年前的家庭作业。
答案 0 :(得分:15)
晚会很晚,但我认为这会震撼你的世界:
unique(cummax(sample.int(100)))
答案 1 :(得分:6)
这使用while
循环并包含在函数
# from ?sample
resample <- function(x, ...) x[sample.int(length(x), ...)]
sample_z <- function(n){
z <- numeric(n)
new <- 0
count <- 1
while(new < n){
from <- seq(new+1,n,by=1)
new <- resample(from, size= 1)
z[count] <- new
if(new < n) count <- count+1
}
z[1:count]
}
set.seed(1234)
sample_z(100)
## [1] 12 67 88 96 100
请注意新样本为100时处理的更改以及sample
处理整数的方式而不是x
的向量
实际上,阅读sample
的帮助会给出有用的resample
功能。当长度(x)== 1
答案 2 :(得分:3)
效率不高但是:
X <- 0
samps <- c()
while (X < 100) {
if(is.null(samps)) {z <- 1 } else {z <- 1 + samps[length(samps)]}
if (z == 100) {
samps <- c(samps, z)
} else {
samps <- c(samps, sample(z:100, 1))
}
X <- samps[length(samps)]
}
SAMPS 编辑:从中修剪一点脂肪:
samps <- c()
while (is.null(samps[length(samps)]) || samps[length(samps)] < 100 ) {
if(is.null(samps)) {z <- 1 } else {z <- 1 + samps[length(samps)]}
if (z == 100) {
samps <- c(samps, z)
} else {
samps <- c(samps, sample(z:100, 1))
}
}
samps
答案 3 :(得分:1)
甚至以后参加聚会,但只是为了踢:
X <- Y <- sample(100L)
while(length(X <- Y) != length(Y <- X[c(TRUE, diff(X)>0)])) {}
> print(X)
[1] 28 44 60 98 100
答案 4 :(得分:0)
创建一个随机整数向量,然后对其进行排序。
sort(sample(1:1000, size = 10, replace = FALSE),decreasing = FALSE)
提供1到1000之间的10个随机整数。
> sort(sample(1:1000, size = 10, replace = FALSE),decreasing = FALSE)
[1] 44 88 164 314 617 814 845 917 944 995
这当然也适用于随机小数和浮点数。