Random în Dart

Generatorul de numere aleatorii; nextInt(max) dă un întreg între 0 și max - 1. Cu seed, șirul se repetă.

Sintaxă
import 'dart:math';

Random([int? seed])
int nextInt(int max)

Ce face Random

Random() creează un generator de numere pseudo-aleatorii. Metoda nextInt(max) returnează un întreg între 0 (inclusiv) și max (exclusiv), deci nextInt(6) dă 0…5. Pentru un zar scrii nextInt(6) + 1.

Dacă dai un seed (sămânță), Random(42), generatorul produce mereu același șir de numere. Este util la teste și la jocuri care trebuie să se poată relua. Fără seed, șirul diferă la fiecare rulare.

max trebuie să fie între 1 și 232; altfel se aruncă RangeError. Pentru parole sau coduri de securitate nu folosi Random(), ci Random.secure().

Parametri

Parametru Descriere
seed Opțional. Sămânța: același seed dă același șir de numere.
max La nextInt: limita superioară, exclusivă (1…232).

Ce returnează

nextInt returnează un int din intervalul [0, max).

Exemple

Exemplul 1: Zaruri cu seed fix

Cu Random(42) rezultatul este același la fiecare rulare.

import 'dart:math';

void main() {
  final r = Random(42);
  final aruncari = [for (var i = 0; i < 8; i++) r.nextInt(6) + 1];
  print('Zaruri: $aruncari');
  final alt = Random(42);
  print('Același seed: ${alt.nextInt(6) + 1} (la fel ca primul zar)');
}

Rezultat

Zaruri: [2, 1, 1, 2, 4, 3, 2, 2]
Același seed: 2 (la fel ca primul zar)

Exemplul 2: Alegerea unui elev la întâmplare

Un indice aleator între 0 și length - 1 alege un element din listă.

import 'dart:math';

void main() {
  final elevi = ['Ana', 'Mihai', 'Ioana', 'Radu', 'Elena'];
  final r = Random(7);
  for (var zi = 1; zi <= 3; zi++) {
    print('Ziua $zi răspunde: ${elevi[r.nextInt(elevi.length)]}');
  }
}

Rezultat

Ziua 1 răspunde: Ana
Ziua 2 răspunde: Ioana
Ziua 3 răspunde: Radu

Exemplul 3: Număr într-un interval oarecare

Pentru un număr între a și b inclusiv: a + nextInt(b - a + 1).

import 'dart:math';

int intre(Random r, int a, int b) => a + r.nextInt(b - a + 1);

void main() {
  final r = Random(2024);
  final temperaturi = [for (var i = 0; i < 5; i++) intre(r, 18, 25)];
  print('Temperaturi simulate în Cluj: $temperaturi');
  print(temperaturi.every((t) => t >= 18 && t <= 25));
}

Rezultat

Temperaturi simulate în Cluj: [22, 20, 25, 22, 19]
true

Greșeli frecvente

  • Crezi că nextInt(10) poate da 10. Limita este exclusivă: valorile sunt 0…9.
  • Creezi un Random() nou în fiecare iterație a unei bucle. Creează generatorul o singură dată și apelează-l de mai multe ori.
  • Folosești Random() pentru parole sau token-uri. Nu este sigur criptografic; folosește Random.secure().

Comenzi înrudite

  • Random.nextDouble: nextDouble dă un număr real între 0.0 (inclusiv) și 1.0 (exclusiv); nextBool dă true sau false.
  • Random.secure: Un generator aleator sigur criptografic, potrivit pentru parole, coduri și token-uri; nu acceptă seed.
  • max: max returnează cel mai mare dintre două numere, iar min pe cel mai mic; păstrează tipul argumentelor.