Iterable.shuffled în Kotlin

Sortare, ordine și duplicate Kotlin 1.2 (random: 1.3)

shuffled amestecă elementele într-o listă nouă, iar random alege un element la întâmplare.

Sintaxă
fun <T> Iterable<T>.shuffled(): List<T>
fun <T> Iterable<T>.shuffled(random: Random): List<T>
fun <T> Collection<T>.random(): T
fun <T> Collection<T>.random(random: Random): T
fun <T> Collection<T>.randomOrNull(): T?

Ce face Iterable.shuffled

shuffled() întoarce o listă nouă cu aceleași elemente într-o ordine aleatorie. random() alege un singur element la întâmplare dintr-o colecție. La fiecare rulare rezultatul este altul.

Ambele acceptă un generator Random. Cu un seed fix, de exemplu Random(42), rezultatul este același la fiecare rulare: util pentru teste și pentru exemple reproductibile (cum sunt cele de pe această pagină).

random() pe o colecție goală aruncă NoSuchElementException; randomOrNull() întoarce null. Pe o MutableList, shuffle() amestecă pe loc.

Parametri

Parametru Descriere
random Opțional: generatorul de numere aleatorii. Fără el se folosește Random.Default.

Ce returnează

shuffled: o listă nouă amestecată. random: un element al colecției.

Exemple

Exemplul 1: Ordinea de prezentare la proiect

Cu Random(42) ordinea este aceeași la fiecare rulare. Fără argument, ar fi alta de fiecare dată.

import kotlin.random.Random

fun main() {
    val echipe = listOf("Ana", "Ion", "Maria", "Radu", "Elena")
    val ordine = echipe.shuffled(Random(42))
    ordine.forEachIndexed { i, nume -> println("${i + 1}. $nume") }
    println("Lista originală: $echipe")
}

Rezultat

1. Ana
2. Elena
3. Maria
4. Ion
5. Radu
Lista originală: [Ana, Ion, Maria, Radu, Elena]

Exemplul 2: Câștigătorul unei tombole

random alege un nume din listă. Pe lista goală folosim randomOrNull, ca să nu se oprească programul.

import kotlin.random.Random

fun main() {
    val participanti = listOf("Andrei", "Bianca", "Cosmin", "Diana")
    val generator = Random(7)
    println("Câștigător: ${participanti.random(generator)}")

    val nimeni = emptyList<String>()
    println(nimeni.randomOrNull(generator) ?: "Niciun participant")
}

Rezultat

Câștigător: Diana
Niciun participant

Exemplul 3: Întrebări de test amestecate

Amestecăm întrebările și luăm primele trei: fiecare elev primește alt set, dar fără repetări.

import kotlin.random.Random

fun main() {
    val intrebari = (1..10).map { "Întrebarea $it" }
    val test = intrebari.shuffled(Random(2024)).take(3)
    println(test)
}

Rezultat

[Întrebarea 10, Întrebarea 6, Întrebarea 7]

Greșeli frecvente

  • Apelezi random() de trei ori ca să alegi trei elemente diferite: pot ieși repetări. Folosește shuffled().take(3).
  • Testezi cod care folosește shuffled() fără seed și rezultatul diferă la fiecare rulare. Dă funcției un Random(seed) fix.

Comenzi înrudite

  • MutableList.shuffle: Amestecă pe loc elementele unei liste modificabile, într-o ordine aleatorie.
  • Iterable.sorted: Întoarce o listă nouă cu elementele în ordine crescătoare (sorted) sau descrescătoare (sortedDescending).
  • Iterable.reversed: Întoarce o listă nouă cu elementele în ordine inversă: ultimul devine primul.
  • Iterable.take: take(n) întoarce primele n elemente, iar drop(n) întoarce tot ce rămâne după ce sari peste primele n.