Генерация равномерно распределенных кратных / выборок в диапазоне

Specific instance of Problem
У меня есть диапазон от 1 до 100. Я хочу сгенерировать n всего чисел в этом диапазоне, которыеas evenly distributed as possible и включите первое и последнее значения.

Example

<code>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]
</code>

What I currently have
У меня на самом деле рабочий подход, но я все еще чувствую, что переборщил с этим и упустил что-то более простое? Это наиболее эффективный подход или его можно улучшить?

<code>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
</code>

Обратите внимание, я гарантирую, что эта функция всегда будет возвращать как минимум нижнее и верхнее предельные значения диапазона. Итак, я заставляюn >= 2

Просто для справки по поиску, я использую это для выборки кадров изображения из отрендеренной последовательности, где вы обычно хотите первый, средний, последний. Но я хотел иметь возможность лучше масштабировать, обрабатывать действительно длинные последовательности изображений и получать лучшее покрытие.

Solved: From the selected answer

В конечном итоге я использовал эту слегка измененную версию ответа @ vartec, чтобы быть генератором, а также ограничилn значение для безопасности:

<code>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))
</code>

Ответы на вопрос(5)

Ваш ответ на вопрос