-1

この実験では、公正なサイコロを転がして x の発言を得てから、公正なコインを x 回投げ、裏の回数を記録します。この実験を 50 回行い、結果をベクトルに記録する必要があります (これを使用してヒストグラムをプロットします)。

これまでの私のコードは次のとおりです。

    for (i in 1:100)
    {X <- sample(6,1,replace=TRUE,c(1,1,1,1,1,1)/6)
    Y <- sample(2,1,replace=TRUE,c(1,1)/2)}
    Youtcomes <- c(sum(Y))
    Youtcomes

しかし、100 個の要素を持つベクトルを与える代わりに、ただ 1 つの数値を取得し続けます。どこが間違っていますか?

注: for ループを使用する必要があります。

4

4 に答える 4

6

Rベクトル化された事実を使用します。その後、二項分布を使用してコイントスを再現できます。

heads <- rbinom(size = sample(6,100, replace = TRUE), n=100, prob = 0.5)
sum(heads)
于 2013-03-06T22:38:46.913 に答える
6

おそらく私は何かを見逃しているのでしょうがsample()、サイコロを 100 回振ってから、それを接続しrbinom()てコイントスを行うという 1 つの呼び出しの何が問題なのですか? sample()からの出力をsize引数に渡します

> set.seed(1)
> rbinom(100, size = sample(6, 100, replace = TRUE), prob = 0.5)
  [1] 1 1 1 6 1 2 2 2 3 1 2 1 2 1 1 0 3 1 1 3 6 1 2 0 2 1 1 1 2 2 2 1 0 1 4 3 3
 [38] 1 5 2 3 2 2 1 3 2 0 2 1 4 2 3 1 1 1 0 1 1 1 1 2 2 1 2 3 1 0 2 1 2 2 4 2 1
 [75] 1 5 3 2 3 5 1 2 3 1 4 0 3 1 2 1 1 0 1 5 2 3 0 2 2 3
于 2013-03-06T22:40:24.770 に答える
4

ディスカリマー: (非常に非効率なソリューションです。mnel/Gavin のソリューションを参照してください)

多くの、多くの、..各回答の下にある多くのコメントを読むことができるように、この回答は、フォーラムの礼儀を維持するという精神で、OPの特定の質問に答えようとします(ただし、彼の要件はおそらく非効率的です)。 ) は、質問の趣味が悪く、私の回答はフォーラムの要件を正当化していないと指摘しました。私はすべての批判を受け入れ、明らかな理由(回答としてマークされている、継続性)のためにのみここに回答を残します。この特定のベクトル化されたソリューションについては、mnel/Gavin の回答を参照することをお勧めします。問題。for-loop の実装に興味がある場合は、この投稿の下部を参照してください。ただし、for-loop の構造を知るためにそれを参照することをお勧めしますが、この特定の for-loop を実装しないでください。問題。ありがとうございました。


あなたのコードは、@ Joshuaがすでに述べた主な問題を除いて、かなりの数の問題でいっぱいです:

最初に、ループ内で X と Y の値を毎回書き直すので、ループの最後には、合計される Y の最後の値だけが残ります。

第二に、あなたのコードYは正しくありません。あなたは、xコイントスの数を獲得しなければならないと言いますが、それでも、あなたは を使いますsample(2, 1, ...)。は、ダイスロールの数字に等しい1ものに置き換える必要があります。X

代わりに次のコードを試してください。

Youtcomes <- sapply(1:100, function(x) {
    X <- sample(1:6, 1, replace=TRUE, rep(1,6)/6)
    Y <- sample(c("H", "T"), X, replace=TRUE, rep(1,2)/2)
    sum(Y == "T")
})

ここでは、100 回ループし、そのたびに 1 ~ 6 の値をサンプリングして X に格納します。次に、head(H) またはtail(T)X回サンプリングして Y に格納します。

ここで、sum(Y == "T")x の現在の値の合計 (1 <= x <= 100) を返します。したがって、最後に、YoutcomesシミュレートされたY == Tail値のセットになります。

次に、を行うことができますhist(Youtcomes)

編集:必要なforループソリューションの場合、

# always assign the variable you'll index inside for-loop
# else the object will keep growing every time and a copy of 
# entire object is made for every i, which makes it extremely 
# slow/inefficient.
Youtcomes <- rep(0, 100)
for (i in 1:100) {
    X <- sample(1:6, 1, replace=TRUE, rep(1,6)/6)
    Y <- sample(c("H", "T"), X, replace=TRUE, rep(1,2)/2)
    # assign output inside the loop with [i] indexing
    Youtcomes[i] <- sum(Y == "T")
    # since Youtcomes is assigned a 100 values of 0's before
    # the values will replace 0' at each i. Thus the object 
    # is not copied every time. This is faster/efficient.
}
于 2013-03-06T22:27:24.100 に答える
1

アルンは私を打ち負かしました。しかし、多くの多くの方法の別の可能性があります(あなたの望ましい結果を正しく理解していれば..

X <- sample(6,100,replace=TRUE,c(1,1,1,1,1,1)/6)
Y <- lapply(X , function(x){ res <- sample( c( "H" , "T" ) , x , replace=TRUE , c(1,1)/2 ) ; table( res ) } )

結果をヒストグラム化したい....

res <- unlist(Y)
hist( res[names( res )=="T"] )
于 2013-03-06T22:32:06.640 に答える