Autor Tema: Ejercicio clase Random  (Leído 254 veces)

lcanciani

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Ejercicio clase Random
« : 11 de Febrero 2019, 22:36 »
Hola,
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 cual seria la forma correcta de hacer que al ingresar por teclado un caracter se convierta a mayusculas.

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");
    }
   
}

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".