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