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()
.
Únete Al Discord De Develou
Si tienes problemas con el código de este tutorial, preguntas, recomendaciones o solo deseas discutir sobre desarrollo Android conmigo y otros desarrolladores, únete a la comunidad de Discord de Develou y siéntete libre de participar como gustes. ¡Te espero!