3

私は頭を動かすことができない小さなRの状況を抱えています。

おそらく、このコードは 2 ~ 3 行で済むはずです。

私がしなければならないことは、すべての数値を 1 回見る前に、10 個の変数のサンプルをいくつ取る必要があるかを計算することです。

言い換えれば、サイコロ (この場合は 10 面) を何回振れば、すべての面を見ることができるかということです。

これまでのところ、私はこれらの線に沿って何かを持っています

    param<-1:10
    count<-0
    seen<-0
    for (i in 1:10) {
      if (sample(param, size=1)==i);
        if i in seen;
          count+=1
          seen+=1
        elif count+=1
    when seen==10 return(count) 
    }

しかし、これは長すぎます。また、フォーマットが正しくないことも知っています(いくつかの時点でPythonコードを使用しようとしているのは確かです)が、Rでループを実行したのはこれが初めてです.

どんな助けでも大歓迎です!

はい、これはプロジェクト用ですが、他に何も考えられません。はい、助けを求めて他の質問/回答を見てみましたが、私の脳は今混乱しています

4

2 に答える 2

3

意図的にオーバーサンプリングすることで、この問題をベクトル化できます。この例では、長さ 1000 のサンプリング ベクトルを作成し、それを使用sapplyして解を見つけます。

@MadSconeによって提案されているように、編集され、ではmatchなく使用されますsapply

set.seed(1984)
n <- 10

x <- sample(n, 1e3, replace=TRUE)
max(match(1:n, x))
[1] 28

実験を繰り返したい場合は、次を使用できますreplicate

do_experiment = function() {
    n <- 10
    x <- sample(n, 1e3, replace=TRUE)
    return(max(match(1:n, x)))
}
replicate(100, do_experiment())
 [1] 28 26 26 15 30 14 29 18 35 24 24 35 42 20 29 18 18 38 14 22 26 26 22 29 31
 [26] 51 14 35 26 19 40 22 23 19 28 15 27 20 16 18 20 19 18 37 24 38 37 54 29 19
 [51] 22 22 14 17 33 22 35 15 32 23 35 27 22 18 30 31 38 36 26 31 43 27 23 21 40
 [76] 25 36 21 39 27 55 28 36 15 48 31 32 46 28 21 40 23 46 24 31 30 25 21 24 20
于 2013-05-09T08:38:35.870 に答える