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 回答