Beruflich Dokumente
Kultur Dokumente
Módulo: Programación
Profesor: Fernando Valdeón Casanova
PRÁCTICA Programación en Java
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.
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.