Gra*_*Guy 0 loops r probability
我一直在努力寻找答案.我保证我会尝试从解决方案中学习.为了学习,我想了解如何使用显式循环,但如果你想分享矢量化方法作为奖励,也非常感谢.
假设我每天都要玩一次游戏,我知道每天获胜的可能性.我想要一个函数,它接受概率向量并至少在一天内返回累积成功概率.因此,如果我连续玩了3天并且胜利的概率是每天0.5,那么我的函数应该返回"0.875,0.75,0.5"
这是我最近尝试编写此函数的失败:
prob_cum <- function(prob_today) {
p_cum <- rep(0, length(prob_today))
for (i in 1:length(prob_today)) {
for (j in i:length(prob_today)) {
p_cum[j] <- p_cum[j-1] - ((1 - p_cum[j-1]) * prob_today[j])
}
}
p_cum
}
prob_daily <- c(.5,.5,.5)
prob_cum(prob_daily)
Run Code Online (Sandbox Code Playgroud)
> 1 - cumprod( 1- c(0.5,0.5,0.5) )
[1] 0.500 0.750 0.875
# (1- prob_success) is the prob_non_success vector
Run Code Online (Sandbox Code Playgroud)
如果需要,可轻松包装成功能.你的初步测试不是很好,因为它没有透露我在cumprod参数中从1减去成功向量的原始错误.
vec<-runif(100)
prob_cum <- function(prob_today) {
p_cum <- rep(0, length(prob_today))
p_cum[1] <- prob_today[1]
for (j in seq_along(prob_today)[-1]) {
p_cum[j] <- p_cum[j-1] + ((1 - p_cum[j-1]) * prob_today[j])
}
p_cum
}
Prob_vec <- function(vec) 1 - cumprod( 1- vec)
require(rbenchmark)
benchmark( prob_cum(vec) , Prob_vec(vec) ,replications=1000)
# test replications elapsed relative user.self sys.self user.child sys.child
#1 prob_cum(vec) 1000 0.538 59.778 0.532 0.008 0 0
#2 Prob_vec(vec) 1000 0.009 1.000 0.008 0.002 0 0
Run Code Online (Sandbox Code Playgroud)