Random în Java

Generator de numere pseudo-aleatorii; nextInt(n) dă un întreg între 0 și n-1. Cu o sămânță fixă, șirul se repetă.

Sintaxă
import java.util.Random;

Random r = new Random();          // sămânță diferită la fiecare rulare
Random r = new Random(42);        // sămânță fixă: aceleași numere de fiecare dată
int nextInt(int limita)           // 0 … limita-1
int nextInt(int start, int limita) // start … limita-1 (Java 17)

Ce face Random

Random produce numere care par aleatorii, dar sunt calculate după o formulă pornind de la o valoare inițială numită sămânță (seed). new Random() alege singur o sămânță diferită la fiecare pornire. new Random(42) folosește sămânța 42 și produce exact același șir de numere la fiecare rulare, pe orice calculator: util pentru teste și simulări reproductibile.

nextInt(n) returnează un întreg între 0 (inclusiv) și n (exclusiv). Pentru un zar scrii nextInt(6) + 1 sau, din Java 17, nextInt(1, 7). nextInt() fără argumente dă orice int, inclusiv negativ.

Random nu este potrivit pentru parole, coduri de confirmare sau token-uri de securitate: numerele lui se pot ghici. Pentru acestea folosește java.security.SecureRandom. În cod cu multe fire, ThreadLocalRandom.current() este mai rapid.

Parametri

Parametru Descriere
seed Opțional, în constructor: sămânța (long). Aceeași sămânță = același șir de numere.
limita Limita superioară exclusivă pentru nextInt; trebuie să fie pozitivă.
start Limita inferioară inclusivă (în varianta cu două argumente).

Ce returnează

Un obiect Random; nextInt returnează un int.

Exemple

Exemplul 1: Zaruri cu sămânță fixă

Cu sămânța 2026, numerele sunt aceleași la fiecare rulare.

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        Random zar = new Random(2026);
        for (int arunc = 1; arunc <= 5; arunc++) {
            System.out.println("Aruncarea " + arunc + ": " + (zar.nextInt(6) + 1));
        }
        System.out.println("Cu nextInt(1, 7): " + zar.nextInt(1, 7));
    }
}

Rezultat

Aruncarea 1: 6
Aruncarea 2: 5
Aruncarea 3: 2
Aruncarea 4: 1
Aruncarea 5: 4
Cu nextInt(1, 7): 5

Exemplul 2: Aceeași sămânță, același șir

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        Random a = new Random(7);
        Random b = new Random(7);
        for (int i = 0; i < 4; i++) {
            int x = a.nextInt(100);
            int y = b.nextInt(100);
            System.out.println(x + " și " + y + " -> egale: " + (x == y));
        }
    }
}

Rezultat

36 și 36 -> egale: true
64 și 64 -> egale: true
85 și 85 -> egale: true
44 și 44 -> egale: true

Exemplul 3: Alegerea unui câștigător la tombolă

Fără sămânță, câștigătorul diferă la fiecare rulare.

import java.util.List;
import java.util.Random;

public class Main {
    public static void main(String[] args) {
        List<String> participanti = List.of("Ana", "Mihai", "Ioana", "Radu", "Elena");
        Random r = new Random();
        System.out.println("Câștigătorul este: " + participanti.get(r.nextInt(participanti.size())));
    }
}

Rezultat posibil (diferă la fiecare rulare)

Câștigătorul este: Ioana

Greșeli frecvente

  • Creezi un new Random() nou în buclă, la fiecare număr. Este inutil și mai lent; creează generatorul o dată și refolosește-l.
  • Scrii Math.abs(r.nextInt()) % n. Pentru Integer.MIN_VALUE, Math.abs rămâne negativ; folosește nextInt(n).
  • Generezi parole sau coduri de resetare cu Random. Folosește SecureRandom.

Comenzi înrudite

  • Random.nextDouble: nextDouble() dă un număr real între 0.0 și 1.0 (fără 1.0); nextBoolean() dă true sau false cu șanse egale.
  • Random.ints: Returnează un IntStream de numere aleatorii: ints(5, 1, 50) dă 5 numere între 1 și 49.
  • UUID: Identificator unic de 128 de biți (ex. 3f2b8c1e-…); UUID.randomUUID() creează unul aleatoriu, practic imposibil de repetat.
  • Math.random: Returnează un număr aleatoriu double, mai mare sau egal cu 0.0 și strict mai mic decât 1.0.