8

我将如何有效地获取值 1:n 的 1×1 升序随机样本,确保每个随机采样值始终高于前一个值?

例如:

对于值 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)

尽管这听起来像是一个家庭作业问题,但事实并非如此。谢天谢地,我多年前离开了做作业的日子。

4

5 回答 5

16

派对迟到了,但我认为这会震撼你的世界:

unique(cummax(sample.int(100)))
于 2012-09-26T10:51:59.800 回答
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功能。这避免了 length(x) == 1 时的陷阱

于 2012-09-26T04:34:22.607 回答
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
于 2012-09-26T04:31:24.070 回答
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
于 2013-02-25T07:04:26.683 回答
1

对随机向量进行排序

创建一个随机整数向量,然后对其进行排序。

sort(sample(1:1000, size = 10, replace = FALSE),decreasing = FALSE)

给出 10 个 1 到 1000 之间的随机整数。

> sort(sample(1:1000, size = 10, replace = FALSE),decreasing = FALSE)
[1]  44  88 164 314 617 814 845 917 944 995

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

于 2016-07-14T06:03:37.170 回答