Duda en JAVA

Buenas, tengo que hacer un programa el cual me muestre aleatoriamente una letra desde la A(65) hasta la z(122), un caracter cada vez que lo ejecute, pero sin pasar por el 91,92,93,94,95,96, que no son letras. La condicion es que no puedo usar ni if ni nada por el estilo, casi casi solo puedo usar el math.random... ¿alguna sugerencia? no se me ocurre nada
Solo puedes dar 1 paso?

Yo haría;
{
   primer numero = math.random(numero1 hasta numero2)
   segundo numero = math.random(numero10 hasta numero 50)
} guardar en array

random del array

mostrar numero

Seguro que se puede mejorar XD
alexricoj escribió:Solo puedes dar 1 paso?

Yo haría;
{
   primer numero = math.random(numero1 hasta numero2)
   segundo numero = math.random(numero10 hasta numero 50)
} guardar en array

random del array

mostrar numero

Seguro que se puede mejorar XD

Tampoco podemos usar arrays, de ahi viene la locura que llevo todo el dia xD
Random r = new Random();
char randomChar = r.nextInt(26) + ( r.nextInt(2) == 0 ?  'a' : 'A')
squarewave escribió:
Random r = new Random();
char randomChar = r.nextInt(26) + ( r.nextInt(2) == 0 ?  'a' : 'A')

Tampoco podemos crear objetos random, hay alguna forma que de dos variables, elija una aleatoriamente? asi puedo crear 2 variables con los dos bloques de randoms, y luego que vuelva a hacer un random para elegir algun numero obtenido de alguna de esas dos
El anterior realmente si que tiene un if...

Esta opción no lo tiene.
Random r = new Random();
int isLowerCase = r.nextInt(2);
char randomChar = r.nextInt(26) + ( 'A' + isLowerCase * 32)


Y lo otro... Sin crear objetos..

int delta = (int)(Math.random() * 26)
int isLowerCase = (int)(Math.random() * 2)
char randomChar = delta + ( 'A' + isLowerCase * 32)


En delta se guarda un entero aleatorio entre 0 y 25 ( inclusive ) . En isLowerCase un valor entre 0 y 1 . El número 32 es la diferencia entre 'A' y 'a' . También lo podrías hacer más finamente como si no conocieses los ASCII ...


int delta = (int)(Math.random() * ('Z'-'A' + 1))
int isLowerCase = (int)(Math.random() * 2)
char randomChar = delta + ( 'A' + isLowerCase * ('a'-'A'))


A lo mejor me sobra un +1 por alguna parte.

De todas formas, tu profesor es un panoli. Puta manía de enseñar a programar haciendo cosas enrevesadas que nadie va a hacer en su vida.
squarewave escribió:El anterior realmente si que tiene un if...

Esta opción no lo tiene.
Random r = new Random();
int isLowerCase = r.nextInt(2);
char randomChar = r.nextInt(26) + ( 'A' + isLowerCase * 32)


Y lo otro... Sin crear objetos..

int delta = (int)(Math.random() * 26)
int isLowerCase = (int)(Math.random() * 2)
char randomChar = delta + ( 'A' + isLowerCase * 32)


En delta se guarda un entero aleatorio entre 0 y 25 ( inclusive ) . En isLowerCase un valor entre 0 y 1 . El número 32 es la diferencia entre 'A' y 'a' . También lo podrías hacer más finamente como si no conocieses los ASCII ...


int delta = (int)(Math.random() * ('Z'-'A' + 1))
int isLowerCase = (int)(Math.random() * 2)
char randomChar = delta + ( 'A' + isLowerCase * ('a'-'A'))


A lo mejor me sobra un +1 por alguna parte.

De todas formas, tu profesor es un panoli. Puta manía de enseñar a programar haciendo cosas enrevesadas que nadie va a hacer en su vida.

Coincido en lo último que dices xD, me vas a llamar tonto pero no acabo de entender el funcionamiento de tu programa, por cierto, me da un error al compilar.
Imagen
¿Te lo tengo que arreglar para que compile? Eso es pasarse xD .

Pista: le tienes que hacer un downcast a algo.

Por cierto, vete aprendiendo a entender lo que hace el código de los demás xD. Si estás aprendiendo a programar porque te quieres dedicar a eso... no te quedará más remedio.
squarewave escribió:¿Te lo tengo que arreglar para que compile? Eso es pasarse xD .

Pista: le tienes que hacer un downcast a algo.

Por cierto, vete aprendiendo a entender lo que hace el código de los demás xD. Si estás aprendiendo a programar porque te quieres dedicar a eso... no te quedará más remedio.

Si, perdona, ya le pase el cast xD
¿Qué es lo que no entiendes?
squarewave escribió:¿Qué es lo que no entiendes?

delta entiendo para que lo utilizas, islowercase supongo que es para saber si es mayus o minus, pero randomChar, osea, entiendo lo que hacen, pero no cual es su funcion, no se si me explico
A ver... Si necesitases sacar una letra aleatoria entre 'A' y 'Z' harías

'A' +  (int)(Math.random()*26)


Eso le suma un número aleatorio entre 0 y 25 a la letra 'A' ( que es el número 67 ) . Math.random() genera un número flotante entre [0,1) . Si multiplicas por 26, será un número flotante entre [0,26) . Si haces un downcast a integer, te lo va a truncar a un valor entre 0 y 25 (inclusive) .

Por otra parte, está lo de generar entre A-Z ó a-z .

A 'A' Le sumas un primer valor aleatorio en el intervalo [0-26) para saber qué letra generas, y le sumas 32 ( o no ) para que genere esa misma letra, pero en minúsculas.

Y en vez de meter el 26 y el 32 a lo bestia, los calculo como diferencias entre las letras extremo de cada intervalo.
squarewave escribió:A ver... Si necesitases sacar una letra aleatoria entre 'A' y 'Z' harías

'A' +  (int)(Math.random()*26)


Eso le suma un número aleatorio entre 0 y 25 a la letra 'A' ( que es el número 67 ) . Math.random() genera un número flotante entre [0,1) . Si multiplicas por 26, será un número flotante entre [0,26) . Si haces un downcast a integer, te lo va a truncar a un valor entre 0 y 25 (inclusive) .

Por otra parte, está lo de generar entre A-Z ó a-z .

A 'A' Le sumas un primer valor aleatorio en el intervalo [0-26) para saber qué letra generas, y le sumas 32 ( o no ) para que genere esa misma letra, pero en minúsculas.

Y en vez de meter el 26 y el 32 a lo bestia, los calculo como diferencias entre las letras extremo de cada intervalo.

Me he puesto a mirarlo detenidamente y lo he entendido antes de leer la explicación, muchísimas gracias por tu ayuda, se agradece :)
squarewave escribió:De todas formas, tu profesor es un panoli. Puta manía de enseñar a programar haciendo cosas enrevesadas que nadie va a hacer en su vida.


squarewave escribió:Por cierto, vete aprendiendo a entender lo que hace el código de los demás xD. Si estás aprendiendo a programar porque te quieres dedicar a eso... no te quedará más remedio.


¿Estas dos cosas no son un poco contradictorias?
No creo.

Yo me encuentro todos los días con código que no hay Dios que entienda y sí que hace cosas necesarias.

Por otra parte, su ejemplo concreto es una puta mierda. Nadie en su sano juicio te pondrá restricciones del tipo " no uses un if para elegir " . Y no acabo de ver la justificación de usar Math.random() sobre new Random() - salvo que estés programando código altamente eficiente - .
Sólo es un ejercicio, está aprendiendo, un profesor no necesariamente busca enseñar lo que luego se va a usar de forma directa, tal vez se le está forzando a encontrar soluciones diferentes a las que está habituado, se le obliga a pensar de forma distinta aunque la solución en sí no sea práctica.

Te decía que era contradictorio porque eso puede facilitar el entender más fácilmente el código de otros, te estás entrenando en abordar problemas desde diferentes perspectivas, no estás encastado en una única manera de hacer independientemente de que ésa sea la mejor o no.
Yo, por lo que veo todos los días, entrenan tanto a la gente a ver los problemas desde otro punto de vista que, al final, los abordan de la manera más complicada posible.

Estoy de acuerdo con lo que dices, pero el sentido común suele ser el menos común de los sentidos.
Otra aproximación al problema...no me gusta, pero es funcional. Haz un string con todas las posibilidades válidas y relaciona una posición aleatoria para extraer ese carácter.

Saludos
Wey escribió:Otra aproximación al problema...no me gusta, pero es funcional. Haz un string con todas las posibilidades válidas y relaciona una posición aleatoria para extraer ese carácter.

Saludos


Quizá es un poco trampa teniendo en cuenta el enunciado, no le dejan usar arrays.
18 respuestas