I will show an approach to do this algebraically, with the aid of R.
Assume the different dice have probability distributions given by vectors
$$ \DeclareMathOperator{\P}{\mathbb{P}}
P(X=i)=p(i)
$$ where $X$ is the number of eyes seen on throwing the dice, and $i$ is a integer in the range $0,1,\dots,n$. So the probability of two eyes, say, is in the third vector component. Then a standard dice has distribution given by the vector $(0,1/6,1/6,1/6,1/6,1/6,1/6)$. The probability generating function (pgf) is then given by $p(t)=\sum_0^6 p(i) t^i$. Let the second dice have distribution given by the vector $q(j)$ with $j$ in range $0,1,\dots,m$. Then the distribution of the sum of eyes on two independent dice rolls given by the product of the pgf' s, $p(t)q(t)$. Writing out the product we can see it is given by the convolution of the coefficient sequences, so can be found by the R function convolve()
. Lets test this by two throws of standard dice:
p <- q <- c(0, rep(1/6, 6))
pq <- convolve(p, rev(q), type="open")
zapsmall(pq)
[1] 0.00000000 0.00000000 0.02777778 0.05555556 0.08333333 0.11111111
[7] 0.13888889 0.16666667 0.13888889 0.11111111 0.08333333 0.05555556
[13] 0.02777778
and you can check that that is correct (by hand calculation). Now for the real question, five dice with 4,6,8,12,20 sides. I will do the calculation assuming uniform probs for each dice. Then:
p1 <- c(0, rep(1/4, 4))
p2 <- c(0, rep(1/6, 6))
p3 <- c(0, rep(1/8, 8))
p4 <- c(0, rep(1/12, 12))
p5 <- c(0, rep(1/20, 20))
s2 <- convolve(p1, rev(p2), type="open")
s3 <- convolve(s2, rev(p3), type="open")
s4 <- convolve(s3, rev(p4), type="open")
s5 <- convolve(s4, rev(p5), type="open")
sum(s5)
[1] 1
zapsmall(s5)
[1] 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00002170
[7] 0.00010851 0.00032552 0.00075955 0.00149740 0.00262587 0.00421007
[13] 0.00629340 0.00887587 0.01191406 0.01534288 0.01907552 0.02300347
[19] 0.02699653 0.03092448 0.03465712 0.03808594 0.04112413 0.04370660
[25] 0.04578993 0.04735243 0.04839410 0.04891493 0.04891493 0.04839410
[31] 0.04735243 0.04578993 0.04370660 0.04112413 0.03808594 0.03465712
[37] 0.03092448 0.02699653 0.02300347 0.01907552 0.01534288 0.01191406
[43] 0.00887587 0.00629340 0.00421007 0.00262587 0.00149740 0.00075955
[49] 0.00032552 0.00010851 0.00002170
plot(0:50, zapsmall(s5))
The plot is shown below:
Now you can compare this exact solution with simulations.
hist(rowSums(sapply(c(4, 6, 8, 12, 20), sample, 1e6, replace = TRUE)))
. It doesn't actually tend towards the low end; of the possible values from 5 to 50, the average is 27.5, and the distribution is (visually) not far from normal. $\endgroup$