Ver índice
Números aleatorios

        Ocultar índice  

   Índice de contenidos
   Instalación en Windows
   Instalación en Ubuntu
   Servidores seguros
   Páginas dinámicas
   Sintaxis básica
   Operaciones
   Arrays
   Formatos de presentación
   Operadores
   Bucles
   Extraer y ord. información
   Funciones
   Ficheros externos
   Imágenes dinámicas
   Gestión de directorios
   Cookies y sesiones
   Clases y objetos
   Ficheros en formato PDF
   Bases de datos MySQL
   PHP y XML
   PDO - Bases SQLite / MySQL
   MySQL a traves de misqli
   Algo de JavaScript y AJAX


El valor Unix Epoch

El conocido como tiempo UNIX –o también Unix Epoch– es un sistema referencia de tiempo cuya unidad son los segundos y que tiene su valor cero a las 00:00:00 horas (GMT) del día uno de enero de 1970.

time()

La función time() devuelve el número de segundos transcurridos desde el comienzo de la Unix Epoch hasta el momento actual. ¿Que cuantos son? Pues mira, desde el comienzo del tiempo UNIX hasta este mismo instante han transcurrido 1 510 992 539 segundos

microtime()

Usando la función microtime() se obtiene una cadena que, además del número de segundos transcurridos desde el comienzo de la Unix Epoch, incluye – al comienzo de ella y separada por un espacio– la parte decimal de ese tiempo expresada en microsegundos.

El valor de la cadena devuelta por microtime() en este instante es 0.98554100 1510992539 . Como verás, aparece la fracción decimal del tiempo Unix Epoch delante de su valor entero.

(double)microtime()

Dado que microtime() devuelve una cadena, es posible convertirla en número de coma flotante anteponiendo (double) que, como recordarás, es la función que permite forzar una cadena a número coma flotante. Una vez cambiado el tipo de variable el valor devuelto por microtime se convierte en: 0.985547 que como puedes observar es un número con seis decimales (si las últimas cifras son ceros no se visualizarán).

Si se multiplica el valor anterior por 1.000.000 obtenemos un número entero de seis cifras que cambia de valor cada millonésima de segundo. Observa el resultado de esta operación: 985557 ¡Fíjate que ha cambiado! La diferencia no es otra cosa que el tiempo transcurrido entre los instantes en que se ejecutaron ambas instrucciones.

Números aleatorios

PHP dispone de dos funciones capaces de generar números aleatorios. Se trata de la función rand() y de la función mejorada mt_rand().

Generación de un número aleatorio
Generador rand() Generador mt_rand()
SintaxisNº aleatorio SintaxisNº aleatorio
echo rand() 1967251785 echo mt_rand() 1873868395

El número aleatorio generado está comprendido entre CERO y un valor máximo que puede determinarse para cada una de las dos opciones mediante las funciones getrandmax() y mt_getrandmax() Estos son sus valores.

Valores máximos de los generadores de números aleatorios
Generador rand() Generador mt_rand()
SintaxisValor máximo SintaxisValor máximo
echo getrandmax() 2147483647 echo mt_getrandmax() 2147483647

Según las librerías que esté usando PHP, puede ocurrir que los valores máximos con ambos generadores sean iguales.

Una semilla que mejora la aleatoriedad

Se pueden ejecutar las funciones srand() o mt_srand() incluyendo en ellas una expresión como la especificada en rojo

srand((double)microtime()*1000000)
mt_rand((double)microtime()*1000000)

antes de invocar a las funciones rand() o mt_rand(). De esta forma estaremos introduciendo una semilla cuyo valor, tal como comentamos en el epígrafe anterior, se modifica cada millonésima de segungo y que mejora sustancialmente la aleatoriedad de los números obtenidos.

Aquí tenemos un ejemplo:

Generación de un número aleatorio con semilla
Generador rand()
SintaxisNº aleatorio
srand((double)microtime()*1000000);
echo rand()
493540154
Generador mt_rand()
SintaxisNº aleatorio
mt_srand((double)microtime()*1000000);
echo mt_rand()
1944728379

Manteniendo la sintaxis anterior –no te olvides de incluir las semillitas– se pueden generar números aleatorios comprendidos dentro del intervalo que preestablezcamos. Bastaría con añadir los valores de los extremos de ese intervalo como parámetros de la función. La sintaxis sería esta:

                 rand(extremo inferior , extremo superior)

y para la función mejorada

                 mt_rand(extremo inferior , extremo superior)

Generación de un número aleatorio delimitando intervalos
Generador rand()
SintaxisNº aleatorio
srand((double)microtime()*1000000);
echo rand(1,300)
163
Generador mt_rand()
SintaxisNº aleatorio
mt_srand((double)microtime()*1000000);
echo mt_rand(1,300)
200