Генерация равномерно распределенных кратных / выборок в диапазоне
Specific instance of Problem
У меня есть диапазон от 1 до 100. Я хочу сгенерировать n всего чисел в этом диапазоне, которыеas evenly distributed as possible и включите первое и последнее значения.
Example
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]
What I currently have
У меня на самом деле рабочий подход, но я все еще чувствую, что переборщил с этим и упустил что-то более простое? Это наиболее эффективный подход или его можно улучшить?
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
Обратите внимание, я гарантирую, что эта функция всегда будет возвращать как минимум нижнее и верхнее предельные значения диапазона. Итак, я заставляюn >= 2
Просто для справки по поиску, я использую это для выборки кадров изображения из отрендеренной последовательности, где вы обычно хотите первый, средний, последний. Но я хотел иметь возможность лучше масштабировать, обрабатывать действительно длинные последовательности изображений и получать лучшее покрытие.
Solved: From the selected answer
В конечном итоге я использовал эту слегка измененную версию ответа @ vartec, чтобы быть генератором, а также ограничилn
значение для безопасности:
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))