Autor Tema: Java problema generar número aleatorio Random siempre genera el mismo CU00908C  (Leído 746 veces)

lcanciani

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
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");
    }
   
}
« última modificación: 23 de Mayo 2020, 15:23 de Ogramar »

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
Re:Ejercicio clase Random
« Respuesta #1 : 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

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

lcanciani

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re:Ejercicio clase Random
« Respuesta #2 : 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 :)

 

Esto es un laboratorio de ideas...
Aprender a programar

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".