Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: lcanciani en 11 de Febrero 2019, 22:36

Título: Java problema generar número aleatorio Random siempre genera el mismo CU00908C
Publicado por: lcanciani en 11 de Febrero 2019, 22:36
Hola, estoy resolviendo el ejercicio CU00908C del curso de Java avanzado de aprenderaprogramar.

Bueno el problema es que al ingresar un rango para que se genere el numero aleatorio, siempre se genera el primer término del rango:

Numero inicial=1
Numero final=15

x=((int)random.nextDouble()*15+1);

Siempre me genera 1 como numero aleatorio.(Este como el mal mayor)

Otro problema es ¿cuál sería la forma correcta de hacer que al ingresar por teclado un caracter se convierta a mayúsculas?

Enunciado:

EJERCICIO

Crea un programa que cumpla lo indicado a continuación. El programa permitirá jugar a “adivinar un número entero” tantas veces como el usuario desee. En cada ocasión el programa pedirá al usuario el número inicial y el número final de la serie de números entre los que se encontrará el número a adivinar. También preguntará el número de intentos permitidos. En cada intento el número a adivinar será diferente y estará dentro del rango definido por el usuario.

Trás los intentos el programa nos dirá cuantas veces hemos acertado y cuántas veces hemos fallado, los números que eran solución y nos preguntará si queremos volver a jugar.

Ejemplo de ejecución:

Introduce el numero inicial del rango: 40
Introduce el numero final del rango: 60
Introduce el numero de intentos: 2
¿Qué numero estoy pensando? : 44
No has acertado
¿Qué numero estoy pensando? : 42
No has acertado
Has acertado 0 veces y has fallado 2 veces. Eran solución: 49, 41
Quieres probar otra vez ? (S/N): S
Introduce el numero inicial del rango: 4
Introduce el numero final del rango: 6
Introduce el numero de intentos: 2
¿Qué numero estoy pensando? : 4
No has acertado
¿Qué numero estoy pensando? : 5
Has acertado!!
Has acertado 1 veces y has fallado 1 veces. Eran solución: 6, 5
Quieres probar otra vez ? (S/N): N
Adiós

Para comprobar si tu solución es correcta puedes consultar en los foros aprenderaprogramar.com.

Código:

Código: [Seleccionar]
package randomclass;
import java.util.Random;
import java.util.Scanner;
public class RandomClass {

   
    public static void main(String[] args) {
       int ninicial,nfinal,nintentos,npensando,x;
       
       char c;
       Random rnd=new Random();
       Scanner en=new Scanner(System.in);
       System.out.println("Introduce el numero inicial de rango: ");
       ninicial=en.nextInt();
       System.out.println("Introduce el numero final del rango: ");
       nfinal=en.nextInt();
       System.out.println("Introduce el numero de intentos ");
       nintentos=en.nextInt();
       int [] qsio=new int[nintentos];
       do{
       int contaciertos=0,contfallos=0;
       for(int i=0;i<=nintentos-1;i++){
          System.out.println("¿Que numero estoy pensando?");
          npensando=en.nextInt();
          if(npensando==(x=(int)rnd.nextDouble()*nfinal+ninicial)){
              System.out.println("Has acertado!!");
             contaciertos++;
             qsio[i]=x;
          }
          else{
              System.out.println("No has acertado!");
              contfallos++;
              qsio[i]=x;
          }
       }
       System.out.println("has acertado "+contaciertos+" veces y has fallado "+
               contfallos+" veces.");
       System.out.println("Era solucion: ");
       for(int i=0;i<=nintentos-1;i++){
           System.out.println(qsio[i]);
       }
       System.out.println("Quieres probar otra vez? (S/N)");
       c=en.next().charAt(0);
           
       }
       while(c=='S');
       System.out.println("Adios");
    }
   
}
Título: Re:Ejercicio clase Random
Publicado por: paramonso en 12 de Febrero 2019, 16:11
Hola lcanciani.

El primer problema que tienes son los paréntesis al crear el numero aleatorio tu lo tienes asi:
Citar
   if(npensando==(x=(int)rnd.nextDouble()*nfinal+ninicial))
Te faltan los parentesis para crear el numero entero de toda la sentencia (rnd.nextDouble()*n+n).
  if(npensando==(x= (int) ( (rnd.nextDouble()*nfinal+ninicial) ) ))
De la forma que tu lo tienes se evalúa según la prioridad de los operadores y por eso siempre sale el mismo numero.
Poniendo los paréntesis se convierte a entero después  de hacer los cálculos de multiplicación y suma.  Lo puedes comprobar poniendo este bucle for después de introducir la horquilla de números ninicial, nfinal y nintentos.
Código: [Seleccionar]
for(int i=1; i<=10;i++){
           System.out.print("Sin parentesis "+(int)rnd.nextDouble()*nfinal+ninicial+"   ");
           System.out.print("Con parentesis "+(int)(rnd.nextDouble()*nfinal+ninicial)+"\n");
        }

Me remito a el tema : https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=240:generacion-de-numeros-aleatorios-en-java-rangos-clase-random-ejemplos-ejercicios-resueltos-cu00906c&catid=58&Itemid=180 (https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=240:generacion-de-numeros-aleatorios-en-java-rangos-clase-random-ejemplos-ejercicios-resueltos-cu00906c&catid=58&Itemid=180)

En el apartado nº 3.
3. Llamar a una de las funciones miembro que generan un número aleatorio:
Debajo del código de ejemplo se comenta esto:
Citar
En el caso de necesitar números aleatorios enteros en un rango determinado, podemos trasladarnos a un intervalo distinto, simplemente multiplicando, aplicando la siguiente fórmula general:

(int) (rnd.nextDouble() * cantidad_números_rango + término_inicial_rango)
.
Si te fijas la sentencia rnd va envuelta entre parentesis.

Citar
Otro problema es cual seria la forma correcta de hacer que al ingresar por teclado un caracter se convierta a mayusculas.

Para la segunda duda la solucion podria se esta:
System.out.println("Quieres probar otra vez? (S/N)");
     c=Character.toUpperCase (en.next().charAt(0));
     

Espero que te sirva.
Un saludo. ;)

P.D.
Tenemos que intentar a la hora de poner en los foros las soluciones de los ejercicios nombrar en el Asunto : de que ejercicio se trata.
Poner algo como esto :
Citar
Java Avanzado Ejercicio CU00919C Interface Iterator api java hasNext remove
Así cuando los miramos sabemos a que ejercicio en concreto se refiere  :D
Título: Re:Ejercicio clase Random
Publicado por: lcanciani en 12 de Febrero 2019, 19:58
uhh que noob estoy :(
Citar
Tenemos que intentar a la hora de poner en los foros las soluciones de los ejercicios nombrar en el Asunto : de que ejercicio se trata.
Así será en próximos posteos.
Muchas muchas gracias :)