Generador de codigo utilizando el método random() de Math
A continuación te mostraré cómo crear una
aplicación simple en el lenguaje java que genere una secuencia de carácteres de forma aleatoria para una contraseña, para ello utilizaré el método random() perteneciente a la clase de la librería Math que seleccionará nuestra función entre números y letras, verificando si éste último es mayúscula ó
minúscula. El programa solicitará al usuario la longitud de la contraseña, para ello crearemos una función principal que será el que genere la contraseña y tres funciones más que se encargarán de obtener los carácteres. Cada resultado se concatenará con el siguiente caracter para luego mostrar la contraseña en pantalla.
Puedes hacer que una función llame a otra. Concatenando cada tipo de dato char convirtiéndolo en cadena. Eso lo dejo a criterio tuyo.
Solución:
Lo primero que debemos hacer será buscar la manera de obtener las letras mayúsculas y minúsculas, es por ello que optaré por utilizar la codificación ASCII, para luego convertirlos en un caracter.
Recordemos que las letras mayúsculas se encuentra en el intervalo de la codificación ASCII entre el 65 - 90 por lo tanto crearemos una función que retorne el valor de ese caracter en el rango mencionado, de esta manera realizaremos la petición cada vez que sea necesaria.
public static char mayuscula() { return (char) Math.floor(Math.random() * (90 - 65 + 1) + 65); }
Ahora entre el 97 - 122 se encuentra las letras minúsculas por lo tanto crearemos una función que devuelva ese caracter en el rango definido de manera aleatoria, de esta manera al igual que en la anterior función llamaremos la petición cada vez que sea necesaria.
public static char minuscula() { return (char) Math.floor(Math.random() * (122 - 97 + 1) + 97); }
El rango de los números se encuentra entre el 0 - 9 por lo tanto la codificación de nuestra función sería la siguiente:
public static int numero() { return (int) Math.floor(Math.random()*(9 + 1)); }
Ahora en la parte principal del programa (dentro del void main) tenemos que hacer la recepción de la longitud (tamaño de la contraseña) de nuestro codigo que generar el resultado de cada una de las funciones creadas anteriormente, a continuación les mostraré la aplicación del BufferedReader y Scanner para capturar el manejo del I/O por teclado, esto nos permitirá recepcionar la cantidad de caracteres para nuestra contraseña:
Utilizando BufferedReader:
BufferedReader e = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese la longitud de la contraseña"); int cantidad = Integer.parseInt(e.readLine());
Utilizando Scanner:
Scanner sc = new Scanner(System.in); System.out.println("Ingrese la longitud de la contraseña"); int cantidad = Integer.parseInt(sc.nextLine()); String clave="";
Pero para poder concatenar cada uno de los caracteres y números voy a utilizar las sentencias repetitivas while, do-while y for, la cual irá recorriendo la cantidad de elementos del codigo y evaluando el siguiente; después si un número o un caracter, usando la condicional switch podremos diferenciar como se muestra a continuación:
for(int i = 1 ; i <= cantidad ; i++) { switch((int) Math.floor(Math.random()*(3 - 1 + 1) + 1)) { case 1: clave += mayuscula(); break; case 2: clave += minuscula(); break; case 3: clave += numero(); break; } }
Y por último mostrar la variable clave. Me tomé la molestia de utilizar tanto BufferedReader como el Scanner para la lectura por teclado de ésta manera puedes implementar sin problemas.
A continuación tengo el código completo utilizando el BufferedReader:
package paquete; import java.io.*; /** * @author Ing. Dick Díaz Delgado **/ public class GeneraCodigoBR { public static void main (String[] args)throws IOException { //Utilizando el BufferedReader BufferedReader e = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese la longitud de la contraseña"); int cantidad = Integer.parseInt(e.readLine()); String clave = ""; //Aplicación con while int i = 0; while(i <= cantidad) { switch((int) Math.floor(Math.random()*( 3 - 1 + 1) + 1)) { case 1: clave += mayuscula(); break; case 2: clave += minuscula(); break; case 3: clave += numero(); break; } i++; } System.out.println("Resultado por while: " + clave); //Aplicación con do-while i = 0; clave = ""; do { switch((int) Math.floor(Math.random()*( 3 - 1 + 1) + 1)) { case 1: clave += mayuscula(); break; case 2: clave += minuscula(); break; case 3: clave += numero(); break; } i++; } while(i < cantidad); System.out.println("Resultado por do-while: " + clave); //Aplicación con for clave = ""; for(i = 1 ; i <= cantidad ; i++) { switch((int) Math.floor(Math.random()*(3 - 1 + 1) + 1)) { case 1: clave += mayuscula(); break; case 2: clave += minuscula(); break; case 3: clave += numero(); break; } } System.out.println("Resultado por for: " + clave); } public static char mayuscula() { return (char) Math.floor(Math.random()*(90-65+1)+65); } public static char minuscula() { return (char) Math.floor(Math.random()*(122-97+1)+97); } public static int numero() { return (int) Math.floor(Math.random()*(9+1)); } }
A continuación tengo el código completo utilizando el Scanner:
package paquete; import java.util.Scanner; /** * @author Ing. Dick Díaz Delgado **/ public class GeneraCodigoSC { public static void main (String[] args) { //Utilizando el Scanner Scanner sc = new Scanner(System.in); System.out.println("Ingrese la longitud de la contraseña"); int cantidad = Integer.parseInt(sc.nextLine()); String clave=""; //Aplicación con while int i = 0; while(i <= cantidad) { switch((int) Math.floor(Math.random()*( 3 - 1 + 1) + 1)) { case 1: clave += mayuscula(); break; case 2: clave += minuscula(); break; case 3: clave += numero(); break; } i++; } System.out.println("Resultado por while: " + clave); //Aplicación con do-while i = 0; clave = ""; do { switch((int) Math.floor(Math.random()*( 3 - 1 + 1) + 1)) { case 1: clave += mayuscula(); break; case 2: clave += minuscula(); break; case 3: clave += numero(); break; } i++; } while(i < cantidad); System.out.println("Resultado por do-while: " + clave); //Aplicación con for clave = ""; for(i = 1 ; i <= cantidad ; i++) { switch((int) Math.floor(Math.random()*(3 - 1 + 1) + 1)) { case 1: clave += mayuscula(); break; case 2: clave += minuscula(); break; case 3: clave += numero(); break; } } System.out.println("Resultado por for: " + clave); } public static char mayuscula() { return (char) Math.floor(Math.random()*(90-65+1)+65); } public static char minuscula() { return (char) Math.floor(Math.random()*(122-97+1)+97); } public static int numero() { return (int) Math.floor(Math.random()*(9+1)); } }
Puedes descargarlo completo de la siguiente dirección (clic aquí).
Explicación de grande ayuda, muchas gracias =D
ResponderEliminarGracias por tu apreciación Tiago, muy pronto más novedades.
Eliminar¡Excelente trabajo amigo!
ResponderEliminarMas bien tengo una duda sobre el funcionamiento de las sentencias return, por ejemplo este:
return (char) Math.floor(Math.random() * (90 - 65 + 1) + 65);
Exactamente quería saber por qué se pone los números por separado después de Math.random, agradezco desde ahora tu apoyo.
Vale lo coloqué para entender la referencia que del 65 al 90 son las letras mayúsculas del alfabeto, al igual que del 97 al 122 son las letras minúsculas del alfabeto y en el caso del 1 al 9 son los números. Puedes colocar directamente el resultado (90 - 65 + 1) = 26 sin ningún problema al final el Math.random será el que elija entre el 65 - 90 un número.
EliminarExcelente, gracias.
ResponderEliminar