It can be helpful to have a "gross reality check" (or grc) ((some people call it a sanity check)) that comes at the problem side-ways and can tell you if you are doing something wrong.
Here is R-code to simulate the problem, and give an estimate:
set.seed(1)
temp <- numeric(length=20000)
for(i in 1:20000){
# y <- sample(c(0,1),20,T) # (wrong! Thanks @whuber) discrete
y <- runif(n=20) # continuous outputs
# is it 8 or more
temp[i] <- ifelse(sum(y) >= 8, 1, 0)
}
mean(temp)
This is what it gives:
> mean(temp)
[1] 0.94265
After 20k trials I would expect the estimate to be within 1% or 0.1% of theoretical result.
Here is a plot of 20 runs, showing convergence and spread of the estimate
Here is the list of the tail value for the runs, and the residual from the ensemble mean:
mean err
1 0.94265 0.00324
2 0.94160 0.00219
3 0.93955 0.00014
4 0.94190 0.00249
5 0.93775 -0.00166
6 0.93580 -0.00361
7 0.93840 -0.00101
8 0.93500 -0.00441
9 0.93735 -0.00206
10 0.94030 0.00089
11 0.94160 0.00219
12 0.93965 0.00024
13 0.94005 0.00064
14 0.93810 -0.00131
15 0.93990 0.00049
16 0.93995 0.00054
17 0.93735 -0.00206
18 0.94125 0.00184
19 0.94070 0.00129
20 0.93935 -0.00006
They don't move around much. The standard deviation in those means is ~0.00204, while the ensemble mean is 93.941%
The estimates 93.94% (analytic) and 93.941% (simulated) are ~0.0048 standard deviations apart, which indicates to me that the analytic approach is on the right track.