Generación de números aleatorios en Java

Podemos generar números aleatorios en Java de dos formas distintas:

1. Utilizando el método estático random de la clase Math: Math.random()
2. Utilizando la clase Random

1. Generar números aleatorios utilizando Math.random()

El método random() de la clase Math devuelve un número al azar positivo de tipo double mayor o igual que 0.0 y menor que 1.0

Por ejemplo, el siguiente for genera 5 números aleatorios
for(int i = 1; i<=5; i++){
    System.out.println(Math.random());
}
genera 5 números aleatorios que podrían ser estos:

0.6586423340678433
0.35474701449674206
0.9552201267900652
0.8309552833908893
0.05210677512170114

Para obtener un número entero entre 1 y un límite N, hay que multiplicar el número aleatorio obtenido por N, sumarle 1 y convertirlo a entero:

(int)(Math.random()*N + 1);

Por ejemplo, para obtener 5 números aleatorios enteros entre 1 y 6:
for(int i = 1; i<=5; i++){
    System.out.println((int)(Math.random()*6 + 1));
}
Para obtener con Math.random un número entero entre dos valores DESDE , HASTA, ambos incluidos, debemos usar la fórmula:
(int)(Math.random() * (HASTA - DESDE + 1) + DESDE); 
Por ejemplo, para generar 5 números enteros al azar entre 8 y 15:

for(int i = 1; i<=5; i++){
    System.out.println((int)(Math.random() * (15 - 8 + 1) + 8));
}

2. Generar números aleatorios utilizando la clase Random

La clase Random proporciona un generador de números aleatorios más flexible que el método random de la clase Math anterior.

Se encuentra en el paquete java.util.

Para obtener un número aleatorio utilizando la clase Random debes seguir estos pasos:

1. Importar la clase: import java.util.Random;
2. Crear un objeto de la clase Random
3. Utilizar uno de los métodos de la clase para obtener el número

Algunos métodos de la clase Random:

nextInt() devuelve un número entero positivo o negativo dentro del rango de enteros.

nextInt(int n) devuelve un número entero >=0 y menor que n.
nextDouble() Devuelve un número positivo de tipo double mayor o igual que 0.0 y menor que 1.0
Por ejemplo, para generar un número entero al azar:
Random rnd = new Random();
int n = rnd.nextInt();
System.out.println(n);
El número aleatorio obtenido lo hemos guardado en la variable n.
Si ejecutamos el programa mostrará el número entero que ha obtenido, que podría ser por ejemplo:

-1430279300

Ejemplo para generar un número aleatorio entre 0 y 10
Random rnd = new Random();
int n = rnd.nextInt(11);
System.out.println(n);
Si ejecutamos el programa mostrará el número entero que ha obtenido, que podría ser por ejemplo:

9

rnd.nextInt(11) obtiene numeros enteros aleatorios entre 0 y 10 ambos incluidos.
En general rnd.nextInt(N) obtiene un numero entero aleatorio >= 0 y < N

Ejemplo para generar 5 enteros al azar:
Random rnd = new Random();
for(int i = 1; i <= 5; i++){
    System.out.println(rnd.nextInt());
}
En este bucle for se generan 5 números enteros de forma aleatoria y se muestran por pantalla. Los números podrían ser estos:

-394395199
1133763686
-424454120
1147379979
-2049113297

Ejemplo para obtener 5 enteros al azar entre 0 y 6:
for(int i = 1; i <= 5; i++){
    System.out.println(rnd.nextInt(7));
}
rnd.nextInt(7) obtiene numeros enteros entre 0 y 6 ambos incluidos

Para generar 5 enteros entre 1 y 6:
for(int i = 1; i <= 5; i++){
    System.out.println(rnd.nextInt(6) + 1);
}
rnd.nextInt(6) obtiene numeros enteros entre 0 y 5 ambos incluidos
Como queremos que los números aleatorios sean entre 1 y 6 lo que hacemos es sumarle 1 al número aleatorio obtenido.

En general, para generar enteros entre dos valores DESDE , HASTA, ambos incluidos usaremos esta fórmula:
rnd.nextInt(HASTA – DESDE + 1) + DESDE
Por ejemplo, para generar 5 números entre 10 y 20:
for(int i = 1; i <= 5; i++){
    System.out.println(rnd.nextInt(20 – 10 + 1) + 10);
}
A partir de Java 17 podemos obtener números aleatorios entre dos valores de esta forma:
rnd.nextInt(DESDE, HASTA);
esta instrucción obtiene un número entero aleatorio >= DESDE y < HASTA

Ejemplo: Obtener un número entero aleatorio entre 15 y 78 ambos incluidos:
rnd.nextInt(15, 79);
Ejemplo: Obtener un número entero aleatorio entre -240 y 1000 ambos incluidos:
rnd.nextInt(-240, 1001);

46 comentarios:

  1. Me ha servido de bastante ayuda. Gracias

    ResponderEliminar
  2. con esta explicacion quien necesita maestro....exelente

    ResponderEliminar
  3. Lo máximo, gracias por la explicación, un abrazo

    ResponderEliminar
  4. los numeros generados que da el programa, son tomados por este para generar sobre ellos una nueva serie de numeros.

    ResponderEliminar
  5. EXCELENTE EXPLICACIÓN AMIGO . . FELICIDADES POR TU TRABAJO

    ResponderEliminar
  6. para agregar algo, creo que algo mas simple es sumarle el numero del cual queremos empezar e inicializar en el que queremos terminar, me explico:
    si queremos numeros entre 100 y 200

    Random rnd = new Random();
    for(int i = 1; i<=5; i++)
    System.out.println(rnd.nextInt(100)+100); */lo que estoy haciendo es decir que busque los numeros dentro delos primeros cien numero, como yo quiero enre cien y dosientos le sumo 100 a cada eleccion y quedara entre este rango*/

    En el caso que quisiera entre -50 y 50 seria lo mismo
    inicializando con 101 y restandole el limite que seria 50( 101 por que si contamos desde -50 al 50 tenemos 101 numeros
    esto por ql numero cero igual esta incluido.)
    Esto quedaria asi:
    Random rnd = new Random();
    for(int i = 1; i<=5; i++)
    System.out.println(rnd.nextInt(101)-50);
    En el caso que eligiera el numero maximo que es 100 se le restaria 50 y quedaria en 50,
    ahora si elige el numero minimo que es 0 se le restaria 50 y quedaria en -50.


    ojala se entienda la idea, bye......

    ResponderEliminar
    Respuestas
    1. muchas gracias me sirvio tu aportación amigo
      ya sabes soy una estudiante de sistemas y no siempre todos somos buenos programando.

      Eliminar
    2. Fíjate que en realidad lo que estás haciendo es aplicar la fórmula que se explica en el post.
      rnd.nextInt(hasta-desde+1) + desde
      Entre -50 y 50:
      rnd.nextInt(50 - -50 +1) - 50 => rnd.nextInt(101)-50

      Eliminar
  7. todo eso esta mal porque siempre que se genere en el Math.random un 0.0 el resultado va ser 0 lo que quiere decir que esta maaaaaaaaaaaaaaal. todas las formulas

    ResponderEliminar
    Respuestas
    1. Hola Carlos, si Math.random obtiene un 0.0 el resultado es el límite inferior. Por ejemplo, un número entre 8 y 15:
      (int)(Math.random()*(15-8+1)+8);
      Si Math.random genera un 0 el resultado es:
      (0*(15-8+1)+8) => 0 + 8 = 8

      Eliminar
    2. humm que pena, si es que estaba mirando mal las formulas..muchas gracias

      Eliminar
  8. Disculpen y si quiero que haga desde el 0 al infinito??

    ResponderEliminar
  9. y si quiero q me genere palabras aleatorias combinandolas con case

    ResponderEliminar
  10. muchas gracias, me ha ayudado!!

    ResponderEliminar
  11. Gracias che, me llevo la 1era manera de hacerlo ;)

    ResponderEliminar
  12. hola...nesecito un script que me genere un nro de 4 digitos secuenciales..por ej. 1234, 1235, 1236, 1237..etc.

    gcias.

    elmesiasahora@yahoo.com.ar

    ResponderEliminar
  13. como cambias el limite inferior del random??

    ResponderEliminar
  14. Gracias, muy bien explicado!

    ResponderEliminar
  15. Esta bien.... Me pueden ayudar para generar un numero después de 15 segundos

    ResponderEliminar
  16. Escribir un programa que llene una pila de 50 elementos de tipo entero usando el metodo random de la clase "Math". Pida un dato al usuario, lo busque en la pila y si lo encuentra indique cuantos elementos se retiraron antes de encontrarlo y cuales fueron.
    Alguien lo podría hacer?

    ResponderEliminar
  17. Por si resulta de su interés o el de alguno de sus lectores, le dejo el enlace a un generador de números aleatorios:
    http://informatica-pfont.blogspot.com/2011/07/numeros-aleatorios.html

    ResponderEliminar
  18. Y si necesito un numero aleatorio pero cada 3 segundos.

    ResponderEliminar
  19. Y si necesito un numero aleatorio pero cada 3 segundos.

    ResponderEliminar
  20. Y si quiero que me haga el desayuno, la paja de vez en cuando y me de dinero también. Babosos hacen unas preguntas más tontas. Fino por el profe!....

    ResponderEliminar
  21. Podrías hacer un código que puedas generar números aleatorios entre 2 rangos distintos?

    ResponderEliminar
    Respuestas
    1. Para colocar entre rangos se hace de esta manera Math.random()*10 , eso quiere decir que estas generando aleatorios entre 0 y 10 pero que pasa si quieres un aleatorio entre 20 y 10 solo agregas el más Math.random()*20+10

      Eliminar
  22. Exelente y simple su explicación. Gracias.

    ResponderEliminar
  23. Por ejemplo cad=cad+String.valueOf((int)(Math.random()*(2-(-2)+1)-2))+"\n"; quiero un rango de -2 a 2 pero al hacer eso en un while de 100, solo me saca de -1 a 2.

    ResponderEliminar
  24. y para imprimirlo en un Text Field?. Solo sirve si lo imprimo en consola :(

    ResponderEliminar
  25. Puedes hacer esto
    Int numAutogenerado =0;
    numAutogenerado=rnd.nextInt(6)+1;
    Textfield.settext(numAutogenerado+"")

    ResponderEliminar
  26. ¿Y si necesito que sume los números que me dio?

    ResponderEliminar
  27. AQUI LES DEJO EL CÓDIGO QUE HIZE PARA QUE ME RECONOZCA LOS NEGATIVOS :)
    /*1.-Programa Java que guarda en un array 10 números enteros aleartorios. A continuación se recorre el array y calcula cuántos números son positivos, cuántos negativos y cuántos ceros*/
    import java.util.Scanner;
    import java.util.Random;
    class ejercicio1 {
    public static void main(String args[]) {
    Scanner sc = new Scanner(System.in);

    Random rnd = new Random();
    int array[] = new int[10];
    int positivos = 0, negativos = 0, ceros = 0;
    int i;

    //generamos 10 números aleartorios
    for(i = 0; i < array.length; i++) {
    array[i] = (rnd.nextInt(10-(-10)+0)+(-10));
    }

    //recoremos el array para encontrar números positivos, negativos y ceros
    for(i = 0; i < array.length; i++) {
    if(array[i] > 0) {
    positivos++;
    } else {
    if(array[i] < 0) {
    negativos++;
    } else {
    if(array[i] == 0){
    ceros++;
    }
    }
    }
    }
    //Impresion del array
    for(i = 0; i < array.length; i++) {
    System.out.print(array[i]+" ");
    }
    //Impresion de los contadores
    System.out.print("\nCantidad de positivos: "+positivos);
    System.out.print("\nCantidad de negativos: "+negativos);
    System.out.print("\nCantidad de ceros: "+ceros);
    System.out.println();
    }
    }

    ResponderEliminar
  28. Generar una lista de N numeros aleatorios sin repetición, comprendidos en un rango dado por el usuario.

    Me ayudan por favor

    ResponderEliminar
  29. Hola, este sistema me podría valer para generar números de lotería, para venderlos on line para una rifa???

    ResponderEliminar
  30. Muy buen trabajo, gracias!!

    ResponderEliminar
  31. Muchas gracias me sirvió mucho!

    ResponderEliminar
  32. No me sirve el profesor me dijo que generar 1000 y este genera muy poquitos, no sirve

    ResponderEliminar