Función random En Kotlin

ANUNCIO
Loading...

En este tutorial te mostraremos la sintaxis y uso de la función random en Kotlin, para obtener un elemento aleatorio de una colección.

Función random()

La función de extensión random() retorna un elemento aleatorio de la colección invocadora. Esta operación se encuentra escrita para varios tipos como vemos en las siguientes sintaxis:

// random() en arreglos genéricos
fun <T> Array<out T>.random(): T

// random() en colecciones
fun <T> Collection<T>.random(): T

// random() en secuencias de caracteres
fun CharSequence.random(): Char

En el caso de que el objeto invocador sea vacío, entonces se lanzará una excepción del tipo NoSuchElementException.

Por ejemplo, supongamos que estamos creando una aplicación que realiza preguntas cuya respuesta comienza con una letra al azar del abecedario.

Si el usuario responde correctamente, suma un punto, de lo contrario se le indica que su respuesta es incorrecta.

Usemos la función random() para simular este escenario:

fun main() {
    val alphabet = 'a'..'z'
    val randomLetter = alphabet.random()

    print("¿Qué animal comienza por la letra \"$randomLetter\"?: ")
    val userInput = readLine()

    val animalsDatabase = setOf("Anaconda", "Cerdo", "Mapache", "Tigre","...")

    val correctAnswer = animalsDatabase.any { it == userInput }
    if(correctAnswer){
        println("¡Correcto! +1")
    }else{
        println("¡Ese animal no existe!")
    }
}

Ejemplo de salida:

¿Qué animal comienza por la letra "b"?: babuino
¡Ese animal no existe!

La solución consiste en declarar el alfabeto como un rango de caracteres en alphabet. Luego obtenemos una letra aleatoria a través de la función random().

En seguida preguntamos a usuario el nombre de una animal con la letra aleatoria obtenida y leemos su entrada.

Para comprobar si su respuesta es válida, determinamos si la entrada proveída existe en nuestra base de datos hipotética animalsDatabase, con el uso de la función any(). Dependiendo del resultado se imprimen los mensajes correspondientes.

Función random() Con Parámetro Random

Existe una variación sobrecargada de random() que recibe un generador de números aleatorios Random, el cuál es usado como fuente de aleatoriedad para el retorno.

Recuerda que siempre obtendrás el mismo valor de la colección si usas el mismo valor de semilla en la creación de la instancia Random.

Por ejemplo, al tener una lista de nombres y querer obtener diferentes valores aleatorios con nuestros propios generadores:

fun main() {
    val names = mutableListOf("Finna", "Fjorleif", "Freydis", "Geirhildr", "Geirlaug")
    println(names.random(Random(1)))
    println(names.random(Random(2)))
    println(names.random(Random(1)))
}

Salida:

Finna
Geirlaug
Finna

Función randomOrNull()

La función randomOrNull() obtiene un número aleatorio de la colección como random(), pero solo que esta no lanza excepciones si la colección es vacía, si no que retorna null. Obviamente como se ve en su sintaxis, el retorno es un tipo anulable.

fun <T> Collection<T>.randomOrNull(): T?

Consideremos un escenario donde tenemos una lista mutable con enteros de la cual deseamos ir quitando elementos aleatoriamente y avisar al usuario cuando ya no existan más.

fun main() {
    val numbers = mutableListOf(5, 1, 2, 3, 4, 6, 9, 7, 10)

    do {
        val numberToRemove = numbers.randomOrNull()
        if (numbers.remove(numberToRemove)) {
            println("$numberToRemove eliminado")
        } else {
            println("Colección vacía")
        }

    } while (numberToRemove != null)
}

Salida con eliminaciones aleatorias:

7 eliminado
5 eliminado
10 eliminado
4 eliminado
9 eliminado
6 eliminado
3 eliminado
2 eliminado
1 eliminado
Colección vacía

En este caso removemos elementos en un bucle do..while que usa como condición que el elemento obtenido aleatoriamente no sea null. De esta forma vamos quitando elementos con remove().

¿Ha sido útil esta publicación?