Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

188
Vistas
Función JS que crea un rango de números (incluido el principio y el final) con un límite en los elementos del rango

Se le asigna un número inicial y final y el número máximo de elementos de salida permitidos. ¿Cómo crearía una matriz de salida con una distribución lo más uniforme posible, sin dejar de incluir el primer y el último punto en la salida?

Firma de función

function generatePoints(startingNumber, endingNumber, maxPoints) {}

Función salida deseada

generatePoints(0, 8, 5) // [0, 2, 4, 6, 8]

Esto es lo que probé hasta ahora
 function generatePoints(startingNumber, endingNumber, maxPoints) { const interval = Math.round((endingNumber - startingNumber) / maxPoints) let count = 0 let counter = 0 let points = [] while(count < maxPoints - 1) { points.push(counter) counter+=interval count++ } points.push(endingNumber) return points }

Técnicamente, esto crea el resultado correcto para el caso simple, pero se queda corto cuando se compara con la mayoría de los otros casos extremos debido al hecho de que detengo una iteración antes y luego agrego el punto final. Estoy pensando que la mejor manera de hacer esto (para crear una mejor distribución) es construir desde el centro de la matriz hacia afuera, en lugar de construir desde el inicio de la matriz y luego detener un elemento temprano y agregar el número final.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Tenga en cuenta esto:

 0 2 4 6 8 +-----+ +-----+ +-----+ +-----+ ABCD

Al dividir nuestro rango en intervalos con 5 puntos, incluidos los puntos finales, tenemos solo cuatro intervalos. Siempre será uno menos que el número de puntos. Podemos dividir nuestro rango de manera uniforme en estos rangos más pequeños, simplemente agregando continuamente el ancho de un intervalo, que es solo (endingNumber - startingNumber) / (maxPoints - 1) . Podemos hacerlo así:

 const generatePoints = (startingNumber, endingNumber, maxPoints) => Array .from ( {length: maxPoints}, (_, i) => startingNumber + i * (endingNumber - startingNumber) / (maxPoints - 1) ) console .log (generatePoints (0, 8, 5))

Simplemente construimos una matriz de la longitud correcta, usando el parámetro de índice para contar la cantidad de intervalos más pequeños que estamos usando.

No verificamos errores aquí, y si maxPoints fuera solo 1 , podríamos tener un problema. Pero eso es bastante fácil de manejar como quieras.


Pero hay una preocupación aquí. ¿Por qué el parámetro se llama maxPoints en lugar de points ? Si el número de puntos permitidos es variable, creo que necesitamos más requisitos.

about 4 years ago · Juan Pablo Isaza Denunciar

0

No Math.round(interval) . En cambio Math.round(counter) en ese último momento.

La razón es que si ha agregado k intervalos, el error en lo que está haciendo puede ser de hasta 0.5*k . Pero si redondeas en el último minuto, el error nunca es mayor a 0.5 .

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda