外れは想定していなかったのでシミュレーションプログラムを書き換えた。

sim <- function(p){
n=length(p) # number of items
if(sum(p)>=1){ # no blank and/or rate of probabilities
prob=p/sum(p) # scaling for sum(prob)=1
lot=1:n # no blank lot
}else{
prob=c(p,1-sum(p)) # blank with probability of 1-sum(p)
lot=1:(n+1) # lot[n+1] blank lot
}
y=NULL
while(!all(1:n %in% y)){ # unless all item got
y=append(y,sample(lot,1,prob=prob)) # sample one lot with probabilty prob
}
return(length(y))
}

シミュレーションが1万回程度だといまひとつの近似
> mean(replicate(1e4,sim(1:5/20))) # with blank lot
[1] 25.239
> Gacha(1:5/20)
[1] 24.89805

こういうシミュレーションがお手軽にできるのがR。
Cだと乱数発生から部品製作を始めることになるので俺には無理。