jueves, 19 de mayo de 2022

LAMBDA: Aleatorios sin repetición

Días a trás tuve la necesidad de obtener un listado aleatorio de números sin repetición, y aunque ya escribí al respecto con fórmulas o con VBA) pensé en darle una vuelta con la función LAMBDA, ya que esa faceta recursiva será útil en este caso...

Nuestra fórmula tendrá esta forma:
=LAMBDA(num_eltos;
    min;
    max;
    LET(mn;min;
        mx;max;
        array;ORDENAR(UNICOS(ARCHIVOMAKEARRAY(num_eltos;1;LAMBDA(r;c;ALEATORIO.ENTRE(mn;mx))))); 
        SI(CONTARA(array)<num_eltos;AleatSinRep(num_eltos;mn;mx);array)))

Función que debemos incluir dentro de Administrador de nombres asignándole el nombre 'AleatSinRep', que como ves se emplea dentro de ella misma.
LAMBDA: Aleatorios sin repetición

El resultado será el deseado... un listado de valores sin repetición (probado 10.000 veces)
LAMBDA: Aleatorios sin repetición


Con nuestra recién creado función LAMBDA, tras informar de los tres argumentos necesarios:
num_eltos: para indicar el tamaño del listado
min y max: para marcar el valor más bajo y alto del intervalo de valores en los que se mueve cada aleatorio
Pasamos con la función ARCHIVOMAKEARRAY a crear una matriz/vector del tamaño indicado (num_elementos) de numéros enteros aleatorios entre los valores min y max informados.
Este vector de aleatorios, una vez aplicada la función UNICOS (que elimina posibles duplicidades!!) y ORDENADO por estética, se evalua y verifica cuántos elementos han quedado finalmente... obviamente si en el primer intento hubiera habido algú nrepetido, UNICOS se hubiera encargado de reducir el tamaño de nuestro listado...
De ahí que con el condicional SI comprobemos si disponemos del 'num_eltos' requerido, en caso de no llegar relanzamos nuevamente nuestra función (recursividad al rescate!!), las veces que hagan falta hasta conseguir un listado de elementos únicos sin repetición.

Seguramente no es lo más eficiente en tiempo ni en recursos, pero para pequeños cálculos es válido 👍

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.