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+APILARVrepite la lista de grupos tantas veces como rondas completas. LuegoEXCLUIRcon índice negativo (-_sobran) recorta desde el final para ajustar el total exacto de líneas._ordenyORDENARPOR:BYROWasigna unALEATORIO()a cada elemento yORDENARPORbaraja 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:
LAMBDAcomo función reutilizable: parametrizas líneas y grupos y la llamas donde quieras, como si fuera una función nativa.REDUCE+APILARVpara construir listas de tamaño variable: el patrón estándar cuando no sabes de antemano cuántas filas vas a generar.ORDENARPOR+ALEATORIOpara 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
- Error #CALC! con MAP y AGRUPARPOR: solución con REDUCE+APILARV CasoNuevo reto de Excel resuelto por la comunidad: un usuario necesita aplicar AGRUPARPOR de forma iterativa sobre un rango de códigos de cuenta
- Descomposición de Cholesky con matrices dinámicas: de VBA a LAMBDA+REDUCE CasoJuan Pablo lanza un reto al grupo: tiene una descomposición de Cholesky resuelta con VBA y quiere saber si se puede hacer con matrices dinám
- Cálculos iterativos con REDUCE y APILARV en Excel CasoLa comunidad aborda un caso sobre cómo trabajar con bucles iterativos en Excel usando funciones modernas. Un miembro necesita realizar cálcu
- Repetir valores N veces: tres enfoques con REDUCE, SCAN y ARCHIVOMAKEARRAY CasoJoan Recasens plantea un problema clásico: tiene una lista de categorías (A, B, C) con el número de repeticiones de cada una (4, 2, 3) y qui
- Reducir un número a un dígito con LAMBDA recursiva y secuencia intermedia CasoJoan Recasens plantea un reto matemático: reducir un número a un solo dígito sumando sus cifras de forma recursiva, y además guardar toda la
- Combinaciones de N elementos tomados de K en K: fórmulas con REDUCE y LAMBDA CasoSebas comparte un archivo con un listado de 11 elementos y necesita generar todas las combinaciones posibles tomados de 2 en 2 (sin repetici
- Funciones window en Excel: el total del grupo en cada fila con LAMBDA y BYROW TutorialEn SQL se llaman funciones window: columnas que, para cada fila, traen un agregado calculado sobre un grupo mayor. El total de ese cliente a
- Funciones personalizadas en Excel: LET, LAMBDA y recursividad TutorialCómo pasar de una fórmula escrita a mano a una función propia que puedes llamar por su nombre en cualquier libro. Los tres vídeos de esta pá
- ACTUALIZA listas de SHAREPOINT desde EXCEL Tutorial¿Quieres aprender a actualizar listas de SharePoint de manera masiva y eficiente?
- Diagrama de Gantt en Excel en 6 minutos con barras apiladas TutorialUn diagrama de Gantt en Excel no necesita plantillas de pago ni complementos: sale de un gráfico de barras apiladas horizontal al que se le