Collections.shuffle în Java

Amestecă aleatoriu elementele unei liste, pe loc. Cu un Random cu seed fix, amestecarea iese la fel la fiecare rulare.

Sintaxă
static void shuffle(List<?> list)
static void shuffle(List<?> list, Random rnd)
static void shuffle(List<?> list, RandomGenerator rnd)   // Java 21

Ce face Collections.shuffle

Collections.shuffle(lista) pune elementele într-o ordine aleatorie, fiecare ordine fiind la fel de probabilă. Lista se modifică pe loc. Fără al doilea argument, rezultatul diferă la fiecare rulare.

Dacă dai un new Random(seed) cu un număr fix, amestecarea este reproductibilă: același seed dă aceeași ordine. Este util în teste, în jocuri cu „cod de nivel” sau ca să poți repeta o tragere la sorți.

Parametri

Parametru Descriere
list Lista amestecată (modificabilă).
rnd Sursa de numere aleatorii.

Ce returnează

Nimic (void).

Exemple

Exemplul 1: Ordinea de prezentare, trasă la sorți

Seed-ul 2026 face ca rezultatul să fie același la fiecare rulare.

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Main {
    public static void main(String[] args) {
        List<String> echipe = new ArrayList<>(List.of("Ana", "Radu", "Elena", "Mihai", "Ioana"));
        Collections.shuffle(echipe, new Random(2026));
        for (int i = 0; i < echipe.size(); i++) {
            System.out.println((i + 1) + ". " + echipe.get(i));
        }
    }
}

Rezultat

1. Elena
2. Mihai
3. Radu
4. Ana
5. Ioana

Exemplul 2: Același seed, aceeași ordine

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Main {
    public static void main(String[] args) {
        List<Integer> a = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7, 8));
        List<Integer> b = new ArrayList<>(a);
        Collections.shuffle(a, new Random(7));
        Collections.shuffle(b, new Random(7));
        System.out.println(a);
        System.out.println(b);
        System.out.println("Egale: " + a.equals(b));
    }
}

Rezultat

[1, 3, 7, 2, 5, 4, 8, 6]
[1, 3, 7, 2, 5, 4, 8, 6]
Egale: true

Greșeli frecvente

  • Amesteci o listă creată cu List.of. Apare UnsupportedOperationException; copiaz-o într-un ArrayList.
  • Creezi un new Random(seed) nou cu același seed la fiecare tragere și te miri că iese mereu la fel. Creează obiectul o singură dată și refolosește-l.

Comenzi înrudite

  • Collections.sort: Sortează o listă pe loc: crescător după ordinea naturală sau după un Comparator dat. Echivalent cu lista.sort(…).
  • Collections.reverse: reverse inversează pe loc ordinea elementelor unei liste; swap schimbă între ele elementele de pe două poziții.
  • List: Interfața pentru liste ordonate: elementele au poziții (0, 1, 2…), se pot repeta și se pot citi după index.