Generación de Números Aleatorios en Java

Codigos

Cuando se desarrollan aplicaciones, a menudo es necesario generar números aleatorios. Java proporciona las clases java.lang.Math y java.util.Random para esto. En este artículo discutiré varias formas de generar números aleatorios y daré ejemplos concretos de implementación.

Generación de Números Aleatorios con la Clase Math

Para generar un número aleatorio, Java proporciona una clase Math disponible en el paquete java.util. Esta clase contiene un método estático Math.random() para generar números aleatorios de tipo double.

El método random() devuelve un número positivo mayor o igual que 0,0 y menor que 1,0. Cuando se llama a este método, se crea un objeto generador de números pseudoaleatorios java.util.Random.

Math.random() puede utilizarse con y sin parámetros. Los parámetros se utilizan para especificar el rango de números dentro del cual se generarán los valores aleatorios.

Ejemplo de uso de Math.random():

public static double getRandomNumber(){
    double x = Math.random();
    return x;
}

El método getRandomNumber() utiliza Math.random() para devolver un número positivo que sea mayor o igual a 0,0 o menor que 1,0 .

El resultado de la ejecución del código:

0.4110981161879139
Generación de números aleatorios con la clase Math
Generación de números aleatorios con la clase Math

Números Aleatorios dentro de un Rango Determinado

Para generar números aleatorios en un rango determinado, hay que especificar el rango.

Sintaxis:

(Math.random() * ((max - min) + 1)) + min

Vamos a dividir esta expresión en partes:

  • Primero, multiplicamos el rango de valores por el resultado generado por random().Math.random() * (max - min) devuelve un valor en el rango , donde max no está incluido en el rango especificado. Por ejemplo, Math.random()*5 devolverá un valor en el rango , donde el 5 no está incluido.
  • Amplía el alcance hasta el rango deseado. Para ello se utiliza el valor mínimo.
(Math.random() * ( max - min )) + min

Pero la expresión sigue sin cubrir el valor máximo.

Para obtener el valor máximo, añade 1 al parámetro de rango (max – min). Esto devolverá un número aleatorio en el rango especificado.

double x = (Math.random()*((max-min)+1))+min;

Hay varias formas de aplicar la expresión anterior. Veamos algunas de ellas.

Un Número Double Aleatorio en un Rango Determinado

Por defecto, el método Math.random() devuelve un número aleatorio de tipo double cada vez que es llamado. Por ejemplo:

public static double getRandomDoubleBetweenRange(double min, double max){
    double x = (Math.random()*((max-min)+1))+min;
    return x;
}

Puedes llamar al método anterior desde el método main pasando los argumentos así.

System.out.println("Double entre 5.0 y 10.00: RandomDoubleNumber = "+getRandomDoubleBetweenRange(5.0, 10.00));

El resultado:

Double entre 5.0 y 10.00: 9.363125217298638

Un resultado incluyendo el máximo:

Double entre 5.0 y 10.00: 10.101722451219699

Un Número Entero Aleatorio dentro de un Rango Especificado

Un ejemplo de generación de un valor entero aleatorio dentro de un rango especificado:

public static double getRandomIntegerBetweenRange(double min, double max){
    double x = (int)(Math.random()*((max-min)+1))+min;
    return x;
}

El método getRandomIntegerBetweenRange() genera un entero aleatorio en el rango especificado. Dado que Math.random() genera números aleatorios de coma flotante, debes convertir el valor resultante al tipo int. Este método puede ser llamado desde el método main pasando los argumentos como sigue:

System.out.println("Integer entre 2 y 6: RandomIntegerNumber = "+getRandomIntegerBetweenRange(2,6));

Resultado:

Integer entre 2 y 5: RandomIntegerNumber = 2.0

Inclusive el máximo:

Integer entre 2 y 5: RandomIntegerNumber = 5.0

Nota

También puedes pasar un rango de valores negativos en los argumentos para generar un número negativo aleatorio en ese rango.

Generación de Números Aleatorios mediante la clase Random

La clase java.util.Random se puede utilizar para generar números aleatorios de diferentes tipos: int, float, double, long y boolean.

Para ello, primero se crea una instancia de la clase Random y luego se llama a uno de los métodos del generador aleatorio: nextInt(), nextDouble(), o nextLong().

El método nextInt() de Random toma un entero límite y devuelve un valor int aleatorio desde 0 (inclusive) hasta el límite especificado (no inclusive).

Un ejemplo de uso del método nextInt():

public static int generateRandomInt(int upperRange){
    Random random = new Random();
    return random.nextInt(upperRange);
}

El método main quedaría de la siguiente forma:

public static void main(String[] args) {
        System.out.println("Resultado de número aleatorio entero <10: "+generateRandomInt(10));
                   }

Y un resultado podría ser:

Resultado de número aleatorio entero <10: 3
Generación de números aleatorios con la clase Random
Generación de números aleatorios con la clase Random

Un ejemplo de uso del método nextInt() para generar un entero dentro de un rango dado:

public static int generateRandomIntIntRange(int min, int max) {
    Random r = new Random();
    return r.nextInt((max - min) + 1) + min;
}

El método main quedaría de la siguiente forma:

   public static void main(String[] args) {
        System.out.println("Resultado de número aleatorio entero entre 15 y 30: "+generateRandomIntIntRange(15,30));
                   }

Y un resultado podría ser (máximo, inclusive):

Resultado de número aleatorio entero entre 15 y 30: 30

Los métodos nextFloat() y nextDouble() permiten generar números de coma flotante así como valores de tipo double entre 0,0 y 1,0.

Código para utilizar ambos métodos:

public static double generateRandomDouble(){
    Random random = new Random();
    return random.nextDouble();
}
public static float generateRandomFloat(){
    Random random = new Random();
    return random.nextFloat();
}

Generación de Números Aleatorios en Java con ints()

Generar Números Aleatorios en Java con ints()
Generar Números Aleatorios en Java con ints()

Un nuevo método de la clase java.util.Random, ints(), fue introducido en Java 8. Devuelve un flujo no restringido de valores int pseudoaleatorios. Este método permite especificar un rango de números especificando un valor mínimo y máximo.

Ejemplo de uso del método Random.ints() para generar valores enteros aleatorios en el rango especificado:

public static int getRandomNumberInts(int min, int max){
    Random random = new Random();
    return random.ints(min,(max+1)).findFirst().getAsInt();
}

El método getRandomNumberInts() genera un flujo de enteros aleatorios desde el mínimo (inclusive) hasta el máximo (fuera de rango).

El método ints() crea un IntStream, por lo que se llamará a la función findFirst(). Devuelve un objeto OptionalInt que describe el primer elemento de este flujo. A continuación, el código llama al método getAsInt() para devolver el valor int en OptionalInt.

Un ejemplo de uso del método Random.ints() para generar un flujo de valores enteros aleatorios:

import java.util.Random;
public class NumerosAleatorios {
    public static void main(String[] args) {
        NumerosAleatorios a=new NumerosAleatorios();
        System.out.println("Random int stream:");
        a.getStreamOfRandomInts(5);
    }
    public static void getStreamOfRandomInts(int num) {
        Random random = new Random();
        random.ints(num).sorted().forEach(System.out::println);
        }
}

El resultado del código anterior:

Random int stream:
-1497378212
-666158913
-246203926
1668922044
1908220285

Un ejemplo de uso del método Random.ints() para generar un stream a partir de un rango de valores enteros aleatorios:

public static void getStreamOfRandomIntsWithRange(int num, int min, int max) {
    Random random = new Random();
    random.ints(num,min, max).sorted().forEach(System.out::println);
}

El código para llamar al método anterior:

System.out.println("Random int stream:");
a.getStreamOfRandomIntsWithRange(5,0,15);

El resultado del ejemplo anterior:

Random int stream:
4
8
9
12
12

Además de ints() hay otros métodos que se han añadido a la clase Random en Java 8. Pueden devolver un flujo secuencial de números aleatorios. Estos son:

  • LongStream longs();
  • DoubleStream doubles().

Conclusión

La clase java.util.Random implementa un generador lineal congruente (LCG). Destaca por su rapidez. Sin embargo, no es adecuado para su uso en tiempo real. Por ejemplo, para generar un identificador de sesión único en el servidor, en experimentos científicos, loterías y sorteos de criptografía.

Para los lectores impacientes, puedes echar un vistazo a la clase SecureRandom y a los generadores de números aleatorios Xorshift.

Sobre el Autor:

Hey hola! Yo soy Alex Walton y tengo el placer de compartir conocimientos hacía ti sobre el tema de Programación en Java, desde cero, Online y Gratis.

1 comentario

  1. […] de correo electrónico de los empleados de tu empresa. En el proceso, aprenderás el método Math.random en detalle y perfeccionarás tus habilidades en una de las ideas básicas de la POO: la […]

Deja una Respuesta

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.