Formas de generar un número aleatorio en un rango con Java

Escrito por picodotdev el .
java planeta-codigo
Enlace permanente Comentarios

En Java hay varias formas de generar números aleatorios, la clase Random permite generar números aleatorios individuales y desde Java 8 con la adición de streams permite obtener una secuencia de números aleatorios de tamaño determinado o indefinido. La clase Math también permite generar números aleatorios aunque es más recomendable usar la clase Random. Finalmente, en caso de querer un identificativo único universal está la clase UUID que genera números aleatorios de 128 bits que se representan mediante caracteres alfanuméricos.

Java

Las computadoras hacen el mejor esfuerzo para ser capaces de generar números aleatorios, para ello hacen uso de la entropía de que disponen para obtener aleatoriedad como datos de entrada que recibe por dispositivos de teclado, ratón o red. Generar números aleatorios es útil en ciertas funcionalidades de programación como la criptografía pero también útil en tareas más sencillas como seleccionar un elemento de un array de forma aleatoria u obtener un número aleatorio entre dos cifras.

Todos los lenguajes de programación ofrecen funciones de soporte para generar números aleatorios, el lenguaje Java también puede hacerse de varias formas.

Generar números aleatorios en un rango

Java ofrece varias clases y formas para generar números aleatorios, dependiendo de cada una la forma de generar un número aleatorio u obtener un número aleatorio en un rango varía ligeramente.

Con la clase Random

La clase Random permite generar números aleatorios con varios métodos según el tipo de datos deseado, en el caso de querer números enteros del tipo int con el método nextInt que devuelve números enteros uniformemente distribuidos entre 0 de forma inclusiva y el límite superior indicado de forma exclusiva.

Dada la especificación del método nextInt si se desea un número aleatorio entre un rango distinto que no empiece en el 0 hay que realizar una pequeña operación matemática.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package io.github.picodotdev.blogbitix.javarandom;

...

public class RandomUtil {

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

    ...
}
RandomUtil-random.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package io.github.picodotdev.blogbitix.javarandom;

...

public class Main {

    public static void main(String[] args) {
        System.out.println("Random");
        String randomNumbers = IntStream.rangeClosed(1, 10)
                .mapToObj(i -> Integer.toString(RandomUtil.getInt(0, 10)))
                .collect(Collectors.joining(", "));
        System.out.printf("Numbers: %s%n", randomNumbers);

        ...
    }
}
Main-random.java
1
2
Random
Numbers: 10, 7, 4, 6, 9, 6, 8, 8, 8, 9
RandomUtil-random.out

Usando un stream

En el caso de desear una secuencia de números aleatorios la clase Random ofrece soporte para obtener un stream en Java 8 de enteros que son números aleatorios.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package io.github.picodotdev.blogbitix.javarandom;

...

public class RandomUtil {

    ...

    public static IntStream getIntStream(int min, int max) {
        return new Random().ints(min, max + 1);
    }

    public static IntStream getIntStream(int min, int max, int size) {
        return new Random().ints(size, min, max + 1);
    }

    ...
}
RandomUtil-stream.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package io.github.picodotdev.blogbitix.javarandom;

...

public class Main {

    public static void main(String[] args) {
        ...

        System.out.println("\nStream");
        String streamNumbers = RandomUtil.getIntStream(1, 10, 10)
                .mapToObj(i -> Integer.toString(i))
                .collect(Collectors.joining(", "));
        System.out.printf("Numbers: %s%n", streamNumbers);

        ...
    }
}
Main-stream.java
1
2
Stream
Numbers: 10, 10, 4, 1, 8, 2, 7, 8, 3, 5
RandomUtil-stream.out

Con la clase Math

Es más eficiente usar la clase Random pero otra forma posible de generar números aleatorios es con la clase Math. El método random de Math devuelve números aleatorios del tipo double entre 0 de forma inclusiva y 1 de forma exclusiva. Para obtener el número aleatorio hay que hacer una multiplicación y conversión a entero.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package io.github.picodotdev.blogbitix.javarandom;

...

public class RandomUtil {

    ...

    public static int getIntMath(int min, int max) {
        return (int)(Math.random() * ((max - min) + 1)) + min;
    }

    ...
}
RandomUtil-math.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package io.github.picodotdev.blogbitix.javarandom;

...

public class Main {

    public static void main(String[] args) {
        ...

        System.out.println("\nMath");
        String mathNumbers = IntStream.rangeClosed(1, 10)
                .mapToObj(i -> Integer.toString(RandomUtil.getIntMath(0, 10)))
                .collect(Collectors.joining(", "));
        System.out.printf("Numbers: %s%n", mathNumbers);

        ...
    }
}
Main-math.java
1
2
Math
Numbers: 10, 3, 2, 7, 6, 0, 9, 5, 0, 4
RandomUtil-math.out

Generar un identificativo único universal

Si se desea generar un identificador único universal para una entidad en vez de un número aleatorio en un rango que tiene posibilidades de repetirse está la clase UUID que genera número únicos de 128 bits que se presentan con caracteres alfanuméricos.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package io.github.picodotdev.blogbitix.javarandom;

...

public class RandomUtil {

    ...

    public static UUID getUUID() {
        return UUID UUID.randomUUID();
    }
}
RandomUtil-uuid.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package io.github.picodotdev.blogbitix.javarandom;

...

public class Main {

    public static void main(String[] args) {
        ...

        System.out.println("\nUUID");
        String uuidNumbers = IntStream.rangeClosed(1, 10)
                .mapToObj(i -> RandomUtil.getUUID().toString())
                .collect(Collectors.joining(", "));
        System.out.printf("Numbers: %s%n", uuidNumbers);
    }
}
Main-uuid.java
1
2
UUID
Numbers: 1a42ebd3-0c80-4b45-bc88-b774a43e3758, 5a3b0fe4-8101-48cb-aa97-21e1fc2a3169, 9a58541e-58b9-4743-9f48-639e2d8f1dcf, 108e3db7-210b-4ad9-80b2-6838ebcb9109, ec023062-a7a5-4f59-9385-3ac929c6d28c, 612205dc-9bf7-44a3-9573-d8277aafcefa, 508801be-a5cb-4d9e-b1bc-be7c772ddc9a, cdde20d2-7521-417a-a881-1e20acdfecd7, 2ef8aaf7-647e-45c8-b573-eac65cbfd777, cf4d72a4-aac0-4218-944c-000673fe65bc
RandomUtil-uuid.out
Terminal

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:
./gradlew run


Comparte el artículo: