Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: el_calderas en 12 de Agosto 2015, 08:10

Título: Ejemplo de numeros aleatorios Clase Random Java generar valores en un rango
Publicado por: el_calderas en 12 de Agosto 2015, 08:10
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.
Título: Re:Ejemplo de numeros aleatorios Clase Random Java generar valores en un rango
Publicado por: Alex Rodríguez en 14 de Agosto 2015, 15:07
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
Título: Re:Ejemplo de numeros aleatorios Clase Random Java generar valores en un rango
Publicado por: el_calderas en 16 de Agosto 2015, 22:58
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.