Генерация равномерно распределенных кратных / выборок в диапазоне
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>