Autor Tema: Ejemplo de numeros aleatorios Clase Random Java generar valores en un rango  (Leído 6606 veces)

el_calderas

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 43
    • Ver Perfil
Hola, tengo una duda con la solución de uno de los ejercicios resueltos de la unidad CU00907C.

En el ejercicio piden esto:

"Crear el código de un programa en el que se declaran tres variables tipo int a, b y c, cuyo valor se muestra en pantalla y debe estar comprendido entre cero y 100, utilizando el método nextInt de la clase Random."

Este es el codigo de la solución:
Código: [Seleccionar]
/* Ejemplo uso clase Random() – aprenderaprogramar.com */
import java.util.Random;
public class Programa {
public static void main(String arg[]) {
int a, b, c;
Random rnd = new Random();
a = rnd.nextInt(101);
b = rnd.nextInt(101);
c = rnd.nextInt(101);
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}


Mi duda es, en la unidad 906C se dice que si se necesitan números aleatorios dentro de un rango hay que aplicar la formula:

"(int) (rnd.nextDouble() * cantidad_números_rango + término_inicial_rango)"

El casting con el int, en este caso no seria necesario...

Segun esto, yo el codigo que habria escrito es:

Código: [Seleccionar]
import java.util.Random;
public class Programa {
public static void main(String arg[]) {
int a, b, c;
Random rnd = new Random();
a = rnd.nextInt()*101;
b = rnd.nextInt()*101;
c = rnd.nextInt()*101;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}

Pero con este codigo, los numeros generados son positivos o negativos y fuera del rango [0-100]...¿Por qué?

¿Porque se utiliza en la solución oficial el total de números del rango como parametro del nexInt()?

Muchas gracias por las respuestas.
« Última modificación: 14 de Agosto 2015, 15:06 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola calderas

Mi visión sería partir primero de la definición de los métodos que da el api de java https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#nextInt-int-

Citar
public int nextInt(int bound)

Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence. The general contract of nextInt is that one int value in the specified range is pseudorandomly generated and returned. All bound possible int values are produced with (approximately) equal probability.

Lo que refleja es que el método nextInt (aNumber) nos devuelve un número entero entre 0 (incluido) y aNumber (excluido). Por ejemplo nextInt(101) nos devuelve un entero entre 0 y 100 (ya que el 101 está excluido).


El método nextInt() sin argumentos es otro método y hace otra cosa https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#nextInt--

Citar
public int nextInt()

Returns the next pseudorandom, uniformly distributed int value from this random number generator's sequence. The general contract of nextInt is that one int value is pseudorandomly generated and returned. All 2^32 possible int values are produced with (approximately) equal probability.


Esto reflejaría que este método devuelve cualquier entero. Un entero se define como un número positivo o negativo sin decimales. Como es imposible trabajar con infinitos números el rango se acota a 2^32 de modo que el método devuelve un valor cualquiera entre -4294967296 y 4294967296 (entre -2^32 y 2^32 que es el rango de enteros con que se trabaja).

Una diferencia importante es que nextInt(aNumber) trabaja en un rango entre 0 y aNumber mientras que nextInt() no tiene rango (tiene un límite pero es tan grande que casi es como si no existiera).

Por ello al escribir a = rnd.nextInt(101); estamos obteniendo resultados en un rango

Sin embargo al escribir a = rnd.nextInt()*101; estamos obteniendo "cualquier número multiplicado por 101" donde "cualquier número" puede ser tanto positivo como negativo.

Creo que la clave está en que es un método sobrecargado en el api de java y realmente parece que hicieran lo mismo pero hacen cosas bastante distintas según lleve o no argumentos

Saludos

el_calderas

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 43
    • Ver Perfil
Muchas gracias por la explicación. La verdad es que deberia haber consultado la API de java para confirmar el funcionamiento de estos metodos...y no lo pense.

No me volvera a pasar.
Un saludo.


 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

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