mt_rand()
La función mt_rand() en PHP genera un entero aleatorio usando el algoritmo Mersenne Twister. Aprende su sintaxis, parámetros y casos de uso.
La función mt_rand() en PHP genera un entero aleatorio usando el algoritmo Mersenne Twister. Esta página cubre su sintaxis y parámetros, en qué se diferencia del antiguo rand(), cómo sembrarla para obtener resultados reproducibles, y cuándo deberías usar una alternativa criptográficamente segura.
Qué hace la función mt_rand()
mt_rand() devuelve un entero pseudoaleatorio. "Pseudoaleatorio" significa que los números provienen de un algoritmo determinista inicializado con un estado interno — parecen aleatorios, pero la misma semilla siempre produce la misma secuencia. El algoritmo Mersenne Twister que utiliza produce números de mayor calidad y más uniformemente distribuidos que el generador libc del antiguo rand(), y tiene un período extremadamente largo (no se repetirá durante 2^19937 − 1 valores).
Ten en cuenta que mt_rand() no es criptográficamente seguro: si el estado interno es conocido o recuperable, se pueden predecir valores futuros. Para contraseñas, tokens, sales o cualquier cosa sensible a la seguridad, usa random_int() en su lugar.
Sintaxis
mt_rand(): int
mt_rand(int $min, int $max): int| Parámetro | Descripción |
|---|---|
$min | Opcional. El valor más bajo que puede devolver (inclusive). Por defecto es 0. |
$max | Opcional. El valor más alto que puede devolver (inclusive). Por defecto es mt_getrandmax(). |
Valor de retorno: un entero aleatorio entre $min y $max inclusive, o entre 0 y mt_getrandmax() cuando se llama sin argumentos. Si $min es mayor que $max, PHP emite una advertencia y devuelve false.
Cómo usar la función mt_rand()
Llámala con dos argumentos para elegir un número de un rango inclusivo, o sin ninguno para obtener un valor en el rango completo:
La primera llamada restringe la salida al rango 1–100; la segunda abarca el rango completo, cuyo límite superior puedes inspeccionar con mt_getrandmax() (comúnmente 2147483647).
Casos de uso comunes
Simular una tirada de dados:
<?php
$roll = mt_rand(1, 6);
echo "You rolled a $roll\n";
?>Elegir un elemento aleatorio de un array generando un índice válido:
<?php
$colors = ['red', 'green', 'blue', 'yellow'];
$pick = $colors[mt_rand(0, count($colors) - 1)];
echo "Random color: $pick\n";
?>Usar count($colors) - 1 como límite superior es importante: los índices de array son de base cero, por lo que un array de cuatro elementos tiene índices válidos 0–3. (Para esta tarea específica, array_rand() es una opción más directa.)
Sembrar para resultados reproducibles
Dado que Mersenne Twister es determinista, sembrarlo con mt_srand() hace que la secuencia sea repetible — útil para pruebas, simulaciones o cualquier momento en que necesites que la salida "aleatoria" sea la misma en cada ejecución:
<?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
?>Sin una semilla explícita, PHP inicializa automáticamente el generador, por lo que obtienes una salida diferente en cada ejecución.
Alternativa segura: random_int()
Cuando la aleatoriedad no debe ser adivinable — tokens de sesión, códigos de restablecimiento de contraseña, claves API — mt_rand() no es la herramienta adecuada. Usa random_int(), que obtiene valores de la fuente criptográficamente segura del sistema operativo:
<?php
// Cryptographically secure integer between 1 and 100
$secure = random_int(1, 100);
echo $secure, "\n";
?>Comparte la misma firma (int $min, int $max), por lo que reemplazarla es sencillo.
mt_rand() vs. rand()
Desde PHP 7.1, rand() es un alias de mt_rand() y usa el mismo motor Mersenne Twister, por lo que se comportan de forma idéntica. En versiones anteriores, rand() usaba el generador libc más débil de la plataforma. Prefiere mt_rand() cuando quieras resultados consistentes y de alta calidad en todas las versiones de PHP.
Conclusión
mt_rand() es la función principal para obtener enteros pseudoaleatorios rápidos y de buena calidad en PHP. Úsala para juegos, muestreo, mezcla y aleatoriedad general; siémbrala con mt_srand() cuando necesites secuencias reproducibles; y cambia a random_int() siempre que la seguridad sea importante.