Como generar números aleatorios con el método Math.random de Java

Hola a todos, hoy os explicare como podemos generar números con el método Math.random de la clase Math de Java. Por defecto sería, Math.random(), con este método podemos generar números aleatorios, en principio seria entre 0 y 1, pero esto lo podemos cambiar para que genere un número entre un rango que nosotros deseemos. Para generar un número entre 0 y el número que deseemos, debemos escribir *num_deseado, por ejemplo, Math.random()*30, esto genera números entre 0 y 30, este ultimo no se incluye, el máximo sería 29,9999…

Para generar un número entre un número que deseemos a otro , debemos escribir *(num_minimo-num_maximo)+num_maximo, por ejemplo, Math.random()*(5-20)+20. 

Un buen truco, para recordar esto es multiplicar por 0 para saber el mínimo y por 1 para el máximo. Por ejemplo, en el ejemplo anterior, el mínimo seria 5, ya que 0*(5-20)+20 daría como resultado 5, y el máximo seria 20, ya que 1*(20-5)+5 daría como resultado 20. Por último, haremos que el número generado sea un número entero en lugar de uno de coma flotante, para ello escribimos (int)Math.floor(Math.random()*(num_maximo-num_minimo)+num_minimo). Recordar que en lugar de números podemos usar variables. Veamos unos ejemplos:

public class PruebaApp {

	public static void main(String[] args) {

		int num1=50;
		int num2=120;

		System.out.println("Números generados entre 0 y 20, con decimales (sin incluir el 0 y el 20)");
		for (int i=0;i<1000;i++){
			double numAleatorio=Math.random()*20;
			System.out.println(numAleatorio);
		}

		System.out.println("Números generados entre 5 y 20, con decimales (sin incluir el 5 y el 20)");
		for (int i=0;i<1000;i++){
			double numAleatorio=Math.random()*(20-5)+5;
			System.out.println(numAleatorio);
		}

		System.out.println("Números generados entre 50 y 120, sin decimales (sin incluir el 50 y el 120)");
		for (int i=0;i<1000;i++){
			int numAleatorio=(int)Math.floor(Math.random()*(num1-num2)+num2);
			System.out.println(numAleatorio);
		}

                System.out.println("Números generados entre 50 y 120, sin decimales (incluyendo el 50 y el 120)");
		for (int i=0;i<1000;i++){
			int numAleatorio=(int)Math.floor(Math.random()*(num1-(num2+1))+(num2));
			System.out.println(numAleatorio);
		}
	}

}

Os dejo un método que automatiza este proceso.

 public static int generaNumeroAleatorio(int minimo,int maximo){
        
        int num=(int)Math.floor(Math.random()*(maximo-minimo+1)+(minimo));
        return num;
    }

Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

Etiquetas

17 comments

  1. hola…necesito generar un atributo int de minutos entre 0 y 59 en java…pero no se como hacerlo…si puedieran ayudarme se los agradeceria mucho

  2. Simplemente usa la función que tenemos en esta misma entrada.

    algo asi:

    private int segundos;

    public tuClase(){
    segundos=generarNumeroAleatorio(0,59);
    }

    Como recomendación puedes poner ese metodo en una clase aparte, pero si no te quieres complicar ponla en tu clase tal cual.

  3. El tobias ese no tiene ni idea lo pongo yo i me da mal, por favor borrar el comentario!

    Gracias.

  4. La idea es muy válida, pero la explicación sobre cómo obtener el número máximo y mínimo posibles es una chapuza.Básicamente no puedes obtener el máximo mediante 1*(20-5)+5 y el mínimo mediante 0*(5-20)+20, ambas operaciones dan como resultado 20!!! Si se quiere hacer bien se debe de usar (5-20)+20 o (20-5)+5 para calcular tanto el mínimo como el máximo multiplicando por 0 y 1, al igual que en el código no se deben mezclar ambas expresiones o se podrían car dos números coincidentes.

    Además hay que tener en cuenta que con la expresión matemática empleada para calcular el número nunca saldrá el valor máximo, vasta con hacer la prueba poniendo (int)Math.random()*(2-1)+1 y solamente saldrá 1 todo el rato, mientras que con la expresión aportada por Tobias nos proporciona un número aleatorio entre 1 y 20 AMBOS INCLUSIVE mediante (int)(Math.random()*20+1) y sin necesidad de hacer floor ya que al hacer el casting de double o float a int automáticamente se desechan los decimales.

  5. Buen tuto ! ;)

  6. Hola amigo, felicidades por la página, tengo una duda cuando pones el ejemplo de multiplicar por 0 y por 1 en la multiplicación por 0 no da 5, además no sé si para generar entre dos números es num_mayor – num_menor o viceversa, porque en unos ejemplos pones (20-5)+5 y en otros (num1-num2)+num2 que sería (50-120)+120.
    Saludos

  7. Me ha servido de ayuda esta información, muchas gracias

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *