rand()
Aprende a usar la función rand() en PHP para generar enteros aleatorios, su sintaxis, casos de uso y cuándo evitarla.
La función rand() en PHP genera un entero pseudoaleatorio. Este capítulo cubre su
sintaxis, cómo funcionan los argumentos opcionales de rango, la diferencia entre rand() y la
más rápida mt_rand(), por qué nunca deberías usar ninguna de las dos para seguridad, y algunos patrones
prácticos como lanzar un dado o elegir un elemento aleatorio de un array.
Qué hace la función rand()
rand() es una función integrada de PHP que devuelve un entero aleatorio. Sin argumentos,
devuelve un valor entre 0 y getrandmax() (el valor más grande que puede producir
el generador — al menos 32767). Cuando pasas un $min y un $max, devuelve un
entero en el rango inclusivo $min ≤ n ≤ $max.
Produce números pseudoaleatorios: valores que parecen aleatorios pero son generados por un algoritmo determinista a partir de una semilla interna. Eso está bien para juegos, muestreo y datos de prueba, pero no para nada donde la predictibilidad sea un riesgo (consulta Seguridad más abajo).
Sintaxis
rand(): int
rand(int $min, int $max): int| Parámetro | Descripción |
|---|---|
$min | Opcional. El valor más bajo a devolver. Por defecto es 0. |
$max | Opcional. El valor más alto a devolver. Por defecto es getrandmax(). |
$min y $max son inclusivos, por lo que rand(1, 6) puede devolver 1, 6 o cualquier valor intermedio.
Si pasas $min mayor que $max, PHP 8 lanza un ValueError.
Uso básico
Aquí llamamos a rand() con un rango, almacenamos el resultado en $result y lo imprimimos. Ejecuta el
ejemplo varias veces y obtendrás un número diferente en cada ejecución.
Casos de uso comunes
Algunos patrones que usarás con frecuencia:
<?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";
?>Para seleccionar un elemento de un array, PHP también ofrece el helper dedicado
array_rand(), que es más claro que calcular el índice
manualmente.
rand() vs mt_rand()
mt_rand() utiliza el algoritmo Mersenne Twister. Es más rápido y tiene
mejores propiedades estadísticas que el rand() heredado, por lo que es la opción preferida de uso general.
Ambos comparten la misma firma:
<?php
$a = rand(1, 100); // legacy generator
$b = mt_rand(1, 100); // Mersenne Twister — recommended
echo "$a and $b";
?>Desde PHP 7.1, rand() es en realidad un alias de mt_rand() internamente, por lo que se comportan
igual en PHP moderno. Prefiere mt_rand() en código nuevo para mayor claridad. Su compañero
mt_getrandmax() te indica el valor más grande que puede devolver.
Semilla
Puedes inicializar el generador con srand() (o mt_srand() para mt_rand()). Usar una
semilla fija hace que la secuencia sea reproducible — útil para pruebas:
<?php
srand(42);
echo rand(1, 100), "\n"; // same output every run for seed 42
?>Desde PHP 4.2 casi nunca necesitas llamar a srand() manualmente — PHP inicializa el generador
automáticamente en el primer uso.
Cuándo no usar rand()
rand() y mt_rand() no son criptográficamente seguras. Su salida es predecible,
por lo que nunca las uses para contraseñas, tokens, IDs de sesión, enlaces de restablecimiento de contraseña
ni nada sensible a la seguridad. Para esos casos, 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() tiene la misma firma (min, max) que rand(), por lo que suele ser un reemplazo
directo cuando importa la seguridad.
Resumen
rand($min, $max)devuelve un entero pseudoaleatorio en un rango inclusivo; sin argumentos abarca de0agetrandmax().- Prefiere
mt_rand()para uso general — es más rápido y con mejor distribución (yrand()es un alias desde PHP 7.1). - Usa
random_int()/random_bytes()siempre que el valor deba ser impredecible.
Para más información sobre valores numéricos y helpers matemáticos, consulta PHP Numbers y PHP Math.