El hecho es que tu generas un carácter del ASCII 0 al ASCII 9, que son caracteres no imprimibles. Busca una tabla en internet de código ASCII y verás lo que digo. Pero al sumar '0' al resultado del rand lo que haces es llevar ese resultado al caracter ASCII '0' que ese sí ya es la representación del cero. ASCII dice que los caracteres numéricos van del cero hasta el nueve. Por tanto '0' + 0 es '0', '0' + 1 es '1', '0' + 2 es '2', etc.
Si te fijas lo mismo pasa con las letras: 'a' + 0 es 'a', 'a' + 1 es 'b'... 'A' + 0 es 'A', 'A' + 1 es 'B'...