4

私は C++ プログラマーで、R は初めてです。誰かが、R で for ループを使用するのは悪い考えであり、sapply. 誕生日が一致する確率を計算するために、次のコードを書きました。

prob <- 1           # prob of no coincidence
days <- 365 
k <- 50             # how many people
probability <- numeric()  #probability vector (empty right now)
for(i in 1:k){
    prob <- (days - i + 1)/days * prob # Formula for no coincidence
    probability[i] <- 1 - prob
}

どうすれば同じことができますsapplyか?私は次のようなことをしたい:

1 - sapply(1:length(m), function(x) prod(m[1:x]))

しかし、誕生日が一致しないという式をどのように使用するのでしょうか?

4

2 に答える 2

6

あなたがすることができます:

m <- (days - seq_len(k) + 1) / days
probability <- 1 - sapply(seq_along(m), function(x) prod(m[1:x]))

しかし、それは便利なcumprod機能にはありません:

probability <- 1 - cumprod(m)

これははるかに高速になります。

(長さゼロのベクトルを扱う場合よりもロバストなseq_alongとのピークも示しました。)seq_len:

于 2013-08-18T23:40:29.057 に答える
4

特定の質問については、組み込みの誕生日確率計算機を使用するのがおそらく最善です

sapply(1:50, pbirthday)
于 2013-08-18T23:38:23.663 に答える