选择一个随机数,总是随着上次随机数的增加而增加

时间:2012-09-26 04:17:28

标签: r random sample

我将如何有效地采用值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)

即使这听起来像是一个家庭作业问题,但事实并非如此。我很幸运地离开了很多年前的家庭作业。

5 个答案:

答案 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的向量

编辑2

实际上,阅读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

这当然也适用于随机小数和浮点数。