Distribución equitativa con LAMBDA, REDUCE y ALEATORIO

Héctor plantea la necesidad de repartir un conjunto de líneas (tareas, actividades) entre varios grupos de forma equitativa y aleatoria. Idealmente, si hay 20 tareas y 3 grupos, cada grupo debería recibir un número similar de asignaciones.

Nacho comparte una fórmula LAMBDA reutilizable que acepta el número de líneas y el número de grupos como parámetros:

``
=LAMBDA(_lineas;_grupos;
LET(
_reps; REDONDEAR.MENOS(_lineas/_grupos;0);
_sobran; RESIDUO(_lineas;_grupos);
_lista; SECUENCIA(_grupos);
_listado; EXCLUIR(
REDUCE(_lista;
SECUENCIA(_reps);
LAMBDA(_a;_i;APILARV(_a;_lista))
);
-_sobran
);
_orden; BYROW(_listado;LAMBDA(_x;ALEATORIO()));
_output; ORDENARPOR(_listado;_orden);
_output
)
)(20;3)
`

La fórmula calcula cuántas repeticiones completas caben (REDONDEAR.MENOS) y cuántas sobran (RESIDUO). Luego genera la lista de grupos repetida con REDUCE + APILARV, recorta los elementos sobrantes con EXCLUIR negativo, y finalmente aleatoriza el orden con ORDENARPOR + ALEATORIO vía BYROW.

Un ejemplo elegante de cómo combinar LAMBDA como función reutilizable con REDUCE para construir listas de tamaño variable y ORDENARPOR` para aleatorizar resultados.

El problema: repartir tareas entre grupos, equitativo y al azar

Héctor necesitaba repartir un conjunto de líneas —tareas, actividades— entre varios grupos, de forma equitativa y aleatoria. La regla es intuitiva: si hay 20 tareas y 3 grupos, cada grupo debería llevarse 6 o 7, no 2 uno y 15 otro. El reparto tiene que cuadrar los números y, además, barajar el resultado.

La solución: una LAMBDA reutilizable

Nacho compartió una LAMBDA con dos parámetros —número de líneas y número de grupos— que se puede guardar en el Administrador de nombres y reutilizar en cualquier libro:

=LAMBDA(_lineas;_grupos;
    LET(
        _reps; REDONDEAR.MENOS(_lineas/_grupos;0);
        _sobran; RESIDUO(_lineas;_grupos);
        _lista; SECUENCIA(_grupos);
        _listado; EXCLUIR(
            REDUCE(_lista;
                SECUENCIA(_reps);
                LAMBDA(_a;_i;APILARV(_a;_lista))
            );
            -_sobran
        );
        _orden; BYROW(_listado;LAMBDA(_x;ALEATORIO()));
        _output; ORDENARPOR(_listado;_orden);
        _output
    )
)(20;3)

Cómo funciona, paso a paso

La fórmula descompone el reparto en piezas muy legibles:

  • _reps (REDONDEAR.MENOS(_lineas/_grupos;0)): cuántas rondas completas caben. Con 20 tareas y 3 grupos, 6 rondas.
  • _sobran (RESIDUO(_lineas;_grupos)): cuántas tareas quedan descolgadas tras las rondas completas. Aquí, 2.
  • _listado: REDUCE + APILARV repite la lista de grupos tantas veces como rondas completas. Luego EXCLUIR con índice negativo (-_sobran) recorta desde el final para ajustar el total exacto de líneas.
  • _orden y ORDENARPOR: BYROW asigna un ALEATORIO() a cada elemento y ORDENARPOR baraja la lista con esos valores. El reparto sigue siendo equitativo, pero el orden es impredecible.

El resultado es una columna con el grupo asignado a cada línea: equilibrada por construcción y aleatoria por el barajado final.

Por qué es un patrón valioso

Más allá de este reparto concreto, la fórmula enseña tres técnicas que se combinan una y otra vez en Excel moderno:

  1. LAMBDA como función reutilizable: parametrizas líneas y grupos y la llamas donde quieras, como si fuera una función nativa.
  2. REDUCE + APILARV para construir listas de tamaño variable: el patrón estándar cuando no sabes de antemano cuántas filas vas a generar.
  3. ORDENARPOR + ALEATORIO para barajar: la forma canónica de aleatorizar sin repetir, la misma idea que el muestreo aleatorio.

Funciones clave

  • LAMBDA: define la función reutilizable con sus parámetros.
  • REDONDEAR.MENOS / RESIDUO: calculan rondas completas y sobrantes.
  • REDUCE + APILARV: repiten la lista de grupos.
  • EXCLUIR: recorta el sobrante con índice negativo.
  • ORDENARPOR + BYROW + ALEATORIO: barajan el resultado.

Conclusión

Un problema de logística cotidiano —repartir trabajo de forma justa— se convierte en una pequeña clase de programación funcional en Excel. La combinación de LAMBDA, REDUCE y ORDENARPOR resuelve en una fórmula lo que muchos harían a mano o con VBA, y encima queda reutilizable. Otro caso resuelto en comunidad en InflueXcel.

Más casos con estas funciones

Más contenido de Excel en InflueXcel