Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Baal_30 en 21 Febrero 2015, 23:52 pm



Título: Random de 0 a 10 con dos decimales
Publicado por: Baal_30 en 21 Febrero 2015, 23:52 pm
Buenas, pues eso, estoy haciendo un ejercicio y necesito sacar notas del 0 al 10 con dos decimales.

Tengo un par de problemas, el primero que si pongo rnd.nextDouble(10) me salen hasta 9.xx y si pongo rnd.nextDouble(11) me saca hasta 10.xx decimales... No se que tendría que hacer para que me saque sólo del 0 al 10 (ambos inclusive) y con decimales. Y la otra es que me salen demasiados decimales, ¿que manera usais vosotros para redondear a dos solamente?

Gracias de antemano.


Título: Re: Random de 0 a 10 con dos decimales
Publicado por: engel lex en 22 Febrero 2015, 00:09 am
y si generas un int entre 0 y 1000 y luego divides entre 100? :P


Título: Re: Random de 0 a 10 con dos decimales
Publicado por: 3n31ch en 22 Febrero 2015, 01:51 am
Pongo el código de lo que dijo @Engel lex

Código
  1. Random random = new Random();
  2.        int n1 = (int)(random.nextDouble()*1001); // Se genera  un numero desde el 0 al 1000
  3.        double n2 = (double)n1/100; // Se divide el numero entre 100
  4.        System.out.println(n2);



(según se no existe un rnd.nextDouble(10);).

nextDouble genera un numero entre el 0 a 10 con mas de 15 decimales de exactitud.
Es por esto que lo que hacemos es multiplicar el resultado de nextDouble por la cantidad de números que queremos, y luego le sumamos el numero menor:

Código
  1. double decimal = rnd.nextDobule();
  2. int cantidad = 1001;
  3. int menor = 500;
  4. int numero = (int)(decimal *cantidad) + menor ; // numero sera igual a un numero aleatorio entre 500 y 1500




Por cierto hace tiempo atrás leí un articulo de que la clase Random no genera números realmente aleatorios.  ;)


Título: Re: Random de 0 a 10 con dos decimales
Publicado por: Baal_30 en 22 Febrero 2015, 18:52 pm
ummm que grande, no había pensado en lo de generar un nextInt(1001) y luego entre 100   :o

Nac-ho, el primer código, se podría "simplificar" así :
Código
  1. int n1 = random.nextInt(1001);
  2.  
  3. double n2 = n1/100;

Gracias a los dos ¡! :)


Título: Re: Random de 0 a 10 con dos decimales
Publicado por: Usuario Invitado en 22 Febrero 2015, 21:42 pm
Incluso de puede simplificar aun "más" :xD:

Código
  1. double randomNumber = (double) (new Random().nextInt(1001))/100;

Nota el cast que se hace. Cuando se hace una división entre dos números enteros, la división que lleva a cabo el compilador es una división teniendo en cuenta decimales, pero como ambos números son enteros, el compilador entiende que se desea una división entera y trunca el resultado eliminando los decimales, por lo que devuelve siempre un número entero.

Cuando realizas un cast double, le dices al compilador que no trunque ese resultado y devuelve la división original.




Para generar un número entre 0 y 10, solo se genera un número entre 0 y 1 y se multiplica por 10. A éste resultado lo formateamos con DecimalFormat para que redondee a dos decimales y lo convertimos a Double. El resultado, números entre 0 y 10 con 2 decimales.

Código
  1. double randomString = Double.parseDouble( new DecimalFormat("#.00").format((new Random().nextDouble() * 10)));

Salu2.


Título: Re: Random de 0 a 10 con dos decimales
Publicado por: Baal_30 en 24 Febrero 2015, 09:05 am
Uf el segundo código me lía mucho jaja aún no entiendo bien bien los cast :/

Muchas gracias por las respuestas ;)


Título: Re: Random de 0 a 10 con dos decimales
Publicado por: 3n31ch en 24 Febrero 2015, 16:10 pm
Muchas gracias por el dato del nextInt(), si les soy sincero no utilizo mucho random (y cuando lo aprendí siempre lo hice así como lo hago ahora)  ;D


Título: Re: Random de 0 a 10 con dos decimales
Publicado por: Usuario Invitado en 24 Febrero 2015, 16:31 pm
@Baal. En realidad no es difícil de entender el código que puse anteriormente. Tampoco añadí algún Cast, en el primero sí hice un cast a Double. Sobre los casts, simplemente se fuerza a un tipo de dato convertirse en otro.

El código anterior se podría traspasar más limpio de la siguiente manera:

Código
  1. import java.util.Random;
  2. import java.text.DecimalFormat;
  3.  
  4. public class DecimalNumberGenerator {
  5.  
  6.    private final static int NUMBER_MULTIPLICITY = 10;
  7.  
  8.    public static Double buildNumberWithTwoDecimals() {
  9.        return generateNumber();
  10.    }
  11.  
  12.    private static Double generateNumber() {
  13.        DecimalFormat twoDecimalsFormatter = new DecimalFormat("#.00");
  14.        Random randomNumberGenerator = new Random(System.nanoTime());
  15.        double generatedNumber = randomNumberGenerator.nextDouble() * NUMBER_MULTIPLICITY;
  16.        String formattedNumber = twoDecimalsFormatter.format(generatedNumber);
  17.        // es necesario porque DecimalFormat usa el delimitador decimal ","
  18.        formattedNumber = formattedNumber.replace("," , ".");
  19.        return Double.parseDouble(formattedNumber);
  20.    }
  21.  
  22. }

PD: Si solucionaste tu problema no olvides marcar el título con un check verde. Salu2.

Saludos!


Título: Re: Random de 0 a 10 con dos decimales
Publicado por: Baal_30 en 25 Febrero 2015, 08:59 am
@Baal. En realidad no es difícil de entender el código que puse anteriormente. Tampoco añadí algún Cast, en el primero sí hice un cast a Double. Sobre los casts, simplemente se fuerza a un tipo de dato convertirse en otro.

El código anterior se podría traspasar más limpio de la siguiente manera:

Código
  1. import java.util.Random;
  2. import java.text.DecimalFormat;
  3.  
  4. public class DecimalNumberGenerator {
  5.  
  6.    private final static int NUMBER_MULTIPLICITY = 10;
  7.  
  8.    public static Double buildNumberWithTwoDecimals() {
  9.        return generateNumber();
  10.    }
  11.  
  12.    private static Double generateNumber() {
  13.        DecimalFormat twoDecimalsFormatter = new DecimalFormat("#.00");
  14.        Random randomNumberGenerator = new Random(System.nanoTime());
  15.        double generatedNumber = randomNumberGenerator.nextDouble() * NUMBER_MULTIPLICITY;
  16.        String formattedNumber = twoDecimalsFormatter.format(generatedNumber);
  17.        // es necesario porque DecimalFormat usa el delimitador decimal ","
  18.        formattedNumber = formattedNumber.replace("," , ".");
  19.        return Double.parseDouble(formattedNumber);
  20.    }
  21.  
  22. }

PD: Si solucionaste tu problema no olvides marcar el título con un check verde. Salu2.

Saludos!

Gracias Gus! Lo veía algo más complejo son los métodos que no conocía :P Lo que no entiendo en este código, es que hace el método "buildNumberWithTwoDecimals" si solamente retorna lo que retorna el "generateNumber" ¿no?

Un saludo ¡!


Título: Re: Random de 0 a 10 con dos decimales
Publicado por: Usuario Invitado en 25 Febrero 2015, 11:41 am
Quizás en este ejemplo tan pequeño no es necesario abastraer y encapsular. El objetivo de ello es ocultar la implementacion de generateNumber, por ello lo definimos private. En ocasiones más avanzadas, tendrás que hacerlo para abstraer tu capa de acceso a datos por ejemplo con el uso de servicios que oculten la implementación del DAO o factorías. Ésto ya lo entenderás más adelante ^^.


Título: Re: Random de 0 a 10 con dos decimales
Publicado por: Baal_30 en 26 Febrero 2015, 09:11 am
Aah okey! eso ya se me escapa a mi nivel :/ Pero tomo nota :) Muchas gracias  :D