GENERACIÓN DE NÚMEROS ALEATORIOS EN JAVA

La clase Random proporciona un generador de números aleatorios. Es más flexible que la función random de la clase Math. Vamos a ver un repaso de uso de la clase Random con ejemplos y ejercicios resueltos. La generación de números aleatorios adquiere gran relevancia para un programador, pudiendo tener distintas aplicaciones como:

  1. Construcción preliminar de programas, en los que a falta de datos definitivos, introducimos datos aleatorios.
  2. Simulación de procesos aleatorios (número resultante de tirar un dado, elección de un color por parte de una persona, número premiado en un sorteo de lotería, cantidad de personas que entran a un supermercado en una hora…)
  3. Verificación de programas, y en particular lo que en verificación de algoritmos se conoce como verificación aleatoria (probar el programa con distintos supuestos aleatorios).
  4. Otras aplicaciones.

Pasos sintácticos a emplear para crear una secuencia de números aleatorios:

  1. Proporcionar a nuestro programa información acerca de la clase Random. Al principio del programa escribiremos la siguiente sentencia:
import java.util.Random;
  1. Crear un objeto de la clase Random: la clase Random dispone de dos constructores, para crear un objeto. El primer constructor es:
Random  rnd = new Random();

Este constructor crea un generador de números aleatorios cuya semilla es inicializada automáticamente, en base al tiempo actual. Esto conlleva que en cada ejecución la semilla cambie, es decir, que la secuencia de números aleatorios que se genera en cada ejecución siempre será diferente.

El segundo constructor es:

Random rnd = new Random(inicializar_semilla);

Este constructor nos permite inicializar la semilla manualmente con un número entero cualquiera. Si este número es el mismo en cada ejecución, la secuencia de números aleatorios que se genera en cada ejecución será igual.

  1. Llamar a una de las funciones miembro que generan un número aleatorio:

Lo más habitual, para generar un número aleatorio, es usar la función miembro rnd.nextDouble(). El valor devuelto es de tipo double. Un aspecto importante a tener en cuenta, es que el valor devuelto se encuentra en el rango mayor o igual a cero y menor a 1. Es decir, el número devuelto puede ser cero pero no puede ser uno.

    /* Ejemplo uso clase Random() */
    import java.util.Random;
    public class Programa {
        public static void main(String arg[ ]) {
              Random rnd = new Random();
              System.out.println("Número aleatorio real entre [0,1[ : "+rnd.nextDouble());
         }
    }

En el caso de necesitar números aleatorios enteros en un rango determinado, podemos trasladarnos a un intervalo distinto, simplemente multiplicando, aplicando la siguiente fórmula general:

(int) (rnd.nextDouble() * cantidad_números_rango + término_inicial_rango)

donde (int) al inicio, transforma un número decimal double en entero int, eliminando la parte decimal.