rand()
La funzione rand() in PHP genera un numero intero casuale. Scopri sintassi, utilizzo e differenze con mt_rand().
La funzione rand() in PHP genera un numero intero pseudo-casuale. Questo capitolo tratta la sua sintassi, il funzionamento degli argomenti opzionali per l'intervallo, la differenza tra rand() e il più veloce mt_rand(), perché non dovresti mai usare nessuno dei due per la sicurezza, e alcuni pattern pratici come lanciare un dado o scegliere un elemento casuale da un array.
Cosa fa la funzione rand()
rand() è una funzione PHP integrata che restituisce un intero casuale. Senza argomenti restituisce un valore compreso tra 0 e getrandmax() (il valore più grande che il generatore può produrre — almeno 32767). Quando si passano $min e $max, restituisce un intero nell'intervallo inclusivo $min ≤ n ≤ $max.
Produce numeri pseudo-casuali: valori che sembrano casuali ma sono generati da un algoritmo deterministico a partire da un seme interno. Va benissimo per giochi, campionamenti e dati di test, ma non per situazioni in cui la prevedibilità rappresenta un rischio (vedi Sicurezza di seguito).
Sintassi
rand(): int
rand(int $min, int $max): int| Parametro | Descrizione |
|---|---|
$min | Opzionale. Il valore minimo da restituire. Predefinito a 0. |
$max | Opzionale. Il valore massimo da restituire. Predefinito a getrandmax(). |
$min e $max sono inclusivi, quindi rand(1, 6) può restituire 1, 6, o qualsiasi valore intermedio.
Se si passa $min maggiore di $max, PHP 8 genera un ValueError.
Utilizzo di base
Qui chiamiamo rand() con un intervallo, memorizziamo il risultato in $result e lo stampiamo. Esegui l'esempio alcune volte e otterrai un numero diverso ad ogni esecuzione.
Casi d'uso comuni
Alcuni pattern che userai spesso:
<?php
// 1. Roll a six-sided die
$die = rand(1, 6);
// 2. Pick a random element from an array
$colors = ['red', 'green', 'blue'];
$color = $colors[rand(0, count($colors) - 1)];
// 3. A coin flip
$side = rand(0, 1) === 0 ? 'heads' : 'tails';
echo "Die: $die, Color: $color, Coin: $side";
?>Per selezionare un elemento da un array, PHP offre anche il dedicato
array_rand(), che è più chiaro rispetto al calcolo manuale dell'indice.
rand() vs mt_rand()
mt_rand() utilizza l'algoritmo Mersenne Twister. È più veloce e ha
migliori proprietà statistiche rispetto al legacy rand(), quindi è la scelta preferita per uso generale.
I due condividono la stessa firma:
<?php
$a = rand(1, 100); // legacy generator
$b = mt_rand(1, 100); // Mersenne Twister — recommended
echo "$a and $b";
?>Da PHP 7.1, rand() è in realtà un alias di mt_rand() internamente, quindi si comportano allo stesso modo sui PHP moderni. Preferisci mt_rand() nel nuovo codice per chiarezza. Il suo compagno
mt_getrandmax() indica il valore più grande che può restituire.
Inizializzazione del seme
Puoi inizializzare il generatore con srand() (o mt_srand() per mt_rand()). L'inizializzazione con un valore fisso rende la sequenza riproducibile — utile per i test:
<?php
srand(42);
echo rand(1, 100), "\n"; // same output every run for seed 42
?>Da PHP 4.2 non hai quasi mai bisogno di chiamare srand() manualmente — PHP inizializza il generatore automaticamente al primo utilizzo.
Quando non usare rand()
rand() e mt_rand() non sono crittograficamente sicuri. Il loro output è prevedibile,
quindi non usarli mai per password, token, ID di sessione, link di reimpostazione password o qualsiasi cosa sensibile alla sicurezza. Per questi casi, usa un CSPRNG:
<?php
$secureInt = random_int(1, 100); // cryptographically secure integer
$secureBytes = random_bytes(16); // 16 random bytes
echo $secureInt, ' ', bin2hex($secureBytes);
?>random_int() ha la stessa firma (min, max) di rand(), quindi è generalmente un sostituto immediato quando la sicurezza è importante.
Riepilogo
rand($min, $max)restituisce un intero pseudo-casuale in un intervallo inclusivo; senza argomenti copre da0agetrandmax().- Preferisci
mt_rand()per uso generale — è più veloce e con distribuzione migliore (erand()è un suo alias da PHP 7.1). - Usa
random_int()/random_bytes()ogni volta che il valore deve essere imprevedibile.
Per ulteriori informazioni sui valori numerici e gli helper matematici, consulta PHP Numbers e PHP Math.