我是C ++程序员,我是R的新手。有人告诉我在R中使用for循环是一个坏主意,最好使用sapply
。我编写了以下代码来计算birthday coincidence的概率:
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]))
但如何使用这个公式并不是生日的巧合?
答案 0 :(得分: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
给出了一个峰值,它在处理零长度向量时比:
更强大。)
答案 1 :(得分:4)
对于您的具体问题,最好只使用内置的生日概率计算器
sapply(1:50, pbirthday)