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 に答える