Del manual:
Cita: random.randrange([start], stop[, step])
Return a randomly selected element from range(start, stop, step). This is equivalent to choice(range(start, stop, step)), but doesn’t actually build a range object.
random.randint(a, b) Return a random integer N such that a <= N <= b.
randint devuelve un entero entre a y b
ranrange devuelve un elemento al azar de la lista range(a, b, paso), lo cual es más o menos lo mismo en muchos casos pero no es igual.
primero que nada, randint da un número <= b, mientras que randrange da < b por la definición de range(). Luego, que si usas el tercer parámetro generarás una lista de elementos salteados:
range(0, 10, 2) => [0, 2, 4, 6, 8]
randrange te devolvería un elemento al azar de esta lista.
saludos.