mt_rand()
La funzione mt_rand() in PHP genera un numero intero casuale usando l'algoritmo Mersenne Twister. Scopri sintassi, parametri e utilizzo.
La funzione mt_rand() in PHP genera un numero intero casuale utilizzando l'algoritmo Mersenne Twister. Questa pagina tratta la sua sintassi e i suoi parametri, le differenze rispetto alla più vecchia rand(), come impostare il seed per risultati riproducibili e quando conviene usare un'alternativa crittograficamente sicura.
Cosa fa la funzione mt_rand()
mt_rand() restituisce un numero intero pseudo-casuale. "Pseudo-casuale" significa che i numeri provengono da un algoritmo deterministico alimentato da uno stato interno — sembrano casuali, ma lo stesso seed produce sempre la stessa sequenza. L'algoritmo Mersenne Twister utilizzato produce numeri di qualità superiore e più uniformemente distribuiti rispetto al generatore libc alla base della più vecchia rand(), e ha un periodo estremamente lungo (non si ripete per 2^19937 − 1 valori).
Da notare che mt_rand() non è crittograficamente sicura: se lo stato interno è noto o recuperabile, i valori futuri possono essere previsti. Per password, token, salt o qualsiasi cosa sensibile alla sicurezza, usa random_int().
Sintassi
mt_rand(): int
mt_rand(int $min, int $max): int| Parametro | Descrizione |
|---|---|
$min | Opzionale. Il valore minimo che il risultato può assumere (incluso). Il valore predefinito è 0. |
$max | Opzionale. Il valore massimo che il risultato può assumere (incluso). Il valore predefinito è mt_getrandmax(). |
Valore restituito: un numero intero casuale compreso tra $min e $max inclusi, oppure tra 0 e mt_getrandmax() se chiamata senza argomenti. Se $min è maggiore di $max, PHP emette un avviso e restituisce false.
Come usare la funzione mt_rand()
Chiamala con due argomenti per scegliere un numero in un intervallo inclusivo, oppure senza argomenti per ottenere un valore nell'intero intervallo disponibile:
La prima chiamata limita l'output all'intervallo 1–100; la seconda copre l'intero intervallo, il cui limite superiore puoi verificare con mt_getrandmax() (di solito 2147483647).
Casi d'uso comuni
Simulare il lancio di un dado:
<?php
$roll = mt_rand(1, 6);
echo "You rolled a $roll\n";
?>Scegliere un elemento casuale da un array generando un indice valido:
<?php
$colors = ['red', 'green', 'blue', 'yellow'];
$pick = $colors[mt_rand(0, count($colors) - 1)];
echo "Random color: $pick\n";
?>Usare count($colors) - 1 come limite superiore è importante: gli indici degli array sono a base zero, quindi un array di quattro elementi ha indici validi da 0 a 3. (Per questo scopo specifico, array_rand() è un'opzione più diretta.)
Seed per risultati riproducibili
Poiché il Mersenne Twister è deterministico, impostare il seed con mt_srand() rende la sequenza ripetibile — utile per test, simulazioni o ogni volta che si ha bisogno che l'output "casuale" sia identico a ogni esecuzione:
<?php
mt_srand(42);
echo mt_rand(), "\n"; // same value every run for seed 42
mt_srand(42); // reset to the same seed
echo mt_rand(), "\n"; // identical to the line above
?>Senza un seed esplicito, PHP inizializza automaticamente il generatore, quindi ogni esecuzione produce un output diverso.
Alternativa sicura: random_int()
Quando la casualità non deve essere indovinabile — token di sessione, codici per il reset della password, chiavi API — mt_rand() non è lo strumento giusto. Usa random_int(), che attinge dalla sorgente crittograficamente sicura del sistema operativo:
<?php
// Cryptographically secure integer between 1 and 100
$secure = random_int(1, 100);
echo $secure, "\n";
?>Condivide la stessa firma (int $min, int $max), quindi la sostituzione è immediata.
mt_rand() vs. rand()
A partire da PHP 7.1, rand() è un alias di mt_rand() e usa lo stesso motore Mersenne Twister, quindi si comportano in modo identico. Nelle versioni precedenti, rand() utilizzava il più debole generatore libc della piattaforma. Preferisci mt_rand() quando desideri risultati coerenti e di alta qualità tra le versioni di PHP.
Conclusione
mt_rand() è la funzione ideale per numeri interi pseudo-casuali veloci e di buona qualità in PHP. Usala per giochi, campionamento, shuffling e randomizzazione generale; inizializzala con mt_srand() quando hai bisogno di sequenze riproducibili; e passa a random_int() ogni volta che la sicurezza è importante.