Generar múltiplos / muestras distribuidos uniformemente dentro de un rango

Instancia específica del problema
Tengo un rango de int de 1-100. Quiero generar n números totales dentro de este rango que sontan uniformemente distribuidos como sea posible e incluir los primeros y últimos valores.

Ejemplo

start = 1, end = 100, n = 5   
Output: [1, 25, 50, 75, 100]

start = 1, end = 100, n = 4   
Output: [1, 33, 66, 100]

start = 1, end = 100, n = 2   
Output: [1, 100]

Lo que tengo actualmente
De hecho, tengo un enfoque de trabajo, pero sigo sintiendo que estoy pensando demasiado y me falta algo más simple. ¿Es este el enfoque más eficiente o podría mejorarse?

def steps(start, end, n):
    n = min(end, max(n, 2) - 1)
    mult = end / float(n)
    yield start
    for scale in xrange(1, n+1):
        val = int(mult * scale)
        if val != start:
            yield val

Tenga en cuenta que me estoy asegurando de que esta función siempre devolverá al menos los valores límite inferior y superior del rango. Por lo tanto, me fuerzan >= 2

Solo como referencia de búsqueda, estoy usando esto para muestrear fotogramas de una secuencia renderizada, donde normalmente querría el primero, medio, último. Pero quería poder escalar un poco mejor para manejar secuencias de imágenes realmente largas y obtener una mejor cobertura.

Resuelto: De la respuesta seleccionada.

Terminé usando esta versión ligeramente modificada de la respuesta de @ vartec, para ser un generador, y también limitar eln valor para la seguridad:

def steps(start,end,n):
    n = min(end, max(n, 2))
    step = (end-start)/float(n-1)
    return (int(round(start+x*step)) for x in xrange(n))