Sie sind auf Seite 1von 2

Ciclo Formativo: Desarrollo de aplicaciones multiplataforma

Módulo: Programación
Profesor: Fernando Valdeón Casanova
PRÁCTICA Programación en Java

Práctica 4: Generador de contraseñas


El proyecto se debe llamar PR4-nombreyapellido. Realizar un programa que nos genere
contraseñas aleatorias de una longitud indicada desde teclado (n). Mostrará un mensaje
pidiendo la longitud de caracteres de la contraseña, y a continuación nos mostrará un menú
preguntándonos de qué tipo de caracteres queremos la contraseña. Después de seleccionar
estos parámetros el programa nos generará una contraseña y nos la mostrará por pantalla.

El tipo de contraseña indica qué caracteres debemos utilizar para formarla:


 Letras: Caracteres desde ‘A’ hasta ‘Z’
 Números: números del 0 al 9.
 Letras y caracteres especiales: ‘A’ – ‘Z’ y caracteres ‘!’-‘/’. Estos últimos caracteres
están en la tabla ascii desde la posición 33 hasta la 47.
 Letras, números y caracteres especiales: puede emplear cualquiera de los caracteres
de las anteriores opciones.

Cuando seleccionamos una opción nos creará una contraseña de n caracteres empleando los
caracteres del grupo seleccionado en el menú. La longitud de la contraseña puede ser desde 0
hasta el número que queramos dentro del rango de los enteros positivos. Si introduzco una
longitud de contraseña = 0, el programa simplemente me debe mostrar una cadena de
longitud 0, pero el programa debe funcionar de la misma manera.

Para realizar este programa debo crear los siguientes métodos estáticos:

void mostrarMenu();
Este método nos pedirá la longitud de la contraseña, nos mostrará un menú para
indicar el tipo de contraseña, y finalmente nos mostrará la contraseña. Este método llamará al
método generaPassword(). mostrarMenu() es el único método que muestra mensajes por
pantalla y el único que muestra la contraseña generada.

String generaPassword( int longitud, int tipo );


Este método se encarga de generar una contraseña del tipo especificado en (int tipo), y
nos la devolverá en un String. Recibe la longitud de la contraseña (int longitud) para saber
cómo tiene que ser de larga y es el método que se encarga de decidir el rango de cada uno de
los caracteres de la contraseña.

char letraAleatoria();
Este método simplemente genera una letra aleatoria entre la ‘A’ y la ‘Z’, ambas
incluidas, y la retorna. Es de tipo char, lo que quiere decir que devuelve un tipo char, que
represente esa letra aleatoria.

char caracterEspecialAleatorio();
Método parecido al anterior que devuelve un carácter de los que consideramos
especiales: caracteres ascii desde 33 hasta 47, desde la exclamación hasta la barra de división.

int numeroAleatorio();
Método que devuelve un número aleatorio entre 0 y 9, ambos incluidos.

Los métodos anteriores deben estar implementados. Se pueden usar más métodos.
Ciclo Formativo: Desarrollo de aplicaciones multiplataforma
Módulo: Programación
Profesor: Fernando Valdeón Casanova
PRÁCTICA Programación en Java

Explicación:
Para poder seleccionar caracteres de forma aleatoria, debo emplear el método random(), de la
clase Math. El método random() genera un número aleatorio entre 0 y 1. Por ejemplo, para
poder crear una contraseña de caracteres entre A-Z, debo conocer que las posiciones ascii de
esos caracteres están entre 65 y 90. Entre 65 y 90 hay 26 posiciones numéricas distintas. Si yo
quiero crear un número aleatorio entre 65 y 90, debo crear primero un número aleatorio entre
0 y 25 (26 números distintos), y posteriormente sumar a ese número la posición primera del
rango que necesito:
Math.random() * 25 –> me crea un numero aleatorio entre 0 y 25.(Ni el 0 ni el 25)
(Math-random() * 25) + 65 -> crea un número entre (0 + 65)=65 y (25 + 65)=90

Debo tener en cuenta que lo que obtengo sigue siendo un número decimal entre 65 y 90, por
lo que debo “castearlo” al tipo int para obtener solamente su parte entera. De esta forma
puedo obtener un carácter aleatorio que corresponda con un rango de caracteres ascii.
También debo tener en cuenta que el número aleatorio nunca va a ser 90, por lo que nunca
incluiría la letra Z. Esto se explica más abajo (método random() ).

Pero para las contraseñas de letras y caracteres especiales, debo manejar 2 rangos (65-90 para
letras y 33-47 para caracteres especiales). El método random() solo genera números decimales
entre 0 y 1. Para ello antes de seleccionar un carácter para mi contraseña debería elegir entre
un rango u otro. Para que esta selección sea aleatoria, puedo usar el método random(), para
que me genere un número aleatorio y dependiendo de su valor, seleccionar un rango u otro.

Método random()
Hay una cosa muy importante: el método random genera un número decimal entre 0 y 1. Si yo
hago un cast a entero de lo que me devuelve, debo entender que siempre voy a obtener un 0,
ya que el número aleatorio es entre 0 y 1 sin incluir ninguno. Por lo tanto, si simplemente me
quedo con la parte entera, siempre voy a obtener un 0, y nunca un 1.

Para obtener un numero aleatorio, cuya parte entera sea, tanto 0, como 1, debo hacer lo
siguiente: Math.random()*2 ->ahora los números van desde 0 hasta 2, sin incluir ni 0, ni 2. Al
coger la parte entera, ya obtengo ceros y unos.
Ejemplo:
Random()*10 -> Si el número es menor o igual a 5, tomo una opción, y si es mayor que 5 tomo
otra. O, si el numero está entre 0-3 hago una cosa, siesta entre 4-6 hago otra, y si no haré la
tercera

También puedo resolver este problema empleando el método round() de la clase Math, que
me redondea el número decimal a su entero más cercano:
round( 0,0435 ) -> redondea a 0
round( 0,2) -> redondea a 0
round( 0,4 ) -> redondea a 0
round( 0,5 ) -> redondea a 1
round( 0,6 ) -> redondea a 1
round( 0,8 ) -> redondea a 1
Math.round( Math.random() * 2 ) -> Me devolvería un numero entre 0 y 2 incluyendo ambos,
con más o menos la misma probabilidad para cada número. O sea, ó 0, ó 1, ó 2.
El método random() devuelve un tipo long, y se debe castear a int para asignarlo a una variable
int.
Esto hace más equitativa la selección de una opción. Podría establecer 3 condiciones para
poder elegir un rango entre 3 rangos de caracteres.

Das könnte Ihnen auch gefallen