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 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 5 enteros al azar:

Random rnd = new Random();
for(int i = 1; i<=5; i++)
            System.out.println(rnd.nextInt());

Un posible resultado de este for es:

-394395199
1133763686
-424454120
1147379979
-2049113297

Para generar 5 enteros entre 0 y 6:

for(int i = 1; i<=5; i++)
     System.out.println(rnd.nextInt(7));

Para generar 5 enteros entre 1 y 6:

for(int i = 1; i<=5; i++)
     System.out.println(rnd.nextInt(6)+1);

En general, para generar enteros al azar entre dos límites DESDE , HASTA, ambos incluidos:
rnd.nextInt(HASTA-DESDE+1)+DESDE

Por ejemplo, para generar 5 números aleatorios entre 10 y 20:

for(int i = 1; i<=5; i++)
     System.out.println(rnd.nextInt(20-10+1)+10);

36 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