elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Random de 0 a 10 con dos decimales
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Random de 0 a 10 con dos decimales  (Leído 9,524 veces)
Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Random de 0 a 10 con dos decimales
« 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.


En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Random de 0 a 10 con dos decimales
« Respuesta #1 en: 22 Febrero 2015, 00:09 am »

y si generas un int entre 0 y 1000 y luego divides entre 100? :P


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
3n31ch


Desconectado Desconectado

Mensajes: 445


Grandes conocimientos engendran grandes dudas


Ver Perfil
Re: Random de 0 a 10 con dos decimales
« Respuesta #2 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.  ;)
« Última modificación: 22 Febrero 2015, 02:04 am por Nac-ho » En línea

Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: Random de 0 a 10 con dos decimales
« Respuesta #3 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 ¡! :)
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Random de 0 a 10 con dos decimales
« Respuesta #4 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.
« Última modificación: 22 Febrero 2015, 22:17 pm por Gus Garsaky » En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: Random de 0 a 10 con dos decimales
« Respuesta #5 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 ;)
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
3n31ch


Desconectado Desconectado

Mensajes: 445


Grandes conocimientos engendran grandes dudas


Ver Perfil
Re: Random de 0 a 10 con dos decimales
« Respuesta #6 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
En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Random de 0 a 10 con dos decimales
« Respuesta #7 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!
« Última modificación: 24 Febrero 2015, 16:46 pm por Gus Garsaky » En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: Random de 0 a 10 con dos decimales
« Respuesta #8 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 ¡!
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Random de 0 a 10 con dos decimales
« Respuesta #9 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 ^^.
En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con decimales
Programación Visual Basic
dekland 5 2,537 Último mensaje 3 Marzo 2006, 19:20 pm
por dekland
decimales en VB
Programación Visual Basic
kakinets 1 1,660 Último mensaje 2 Junio 2007, 01:36 am
por <?BRoWLi?>
Ayuda con uso de decimales
.NET (C#, VB.NET, ASP)
eliezeralpr 4 4,742 Último mensaje 27 Abril 2009, 23:02 pm
por AntonioMeucci
Decimales y Redondeo
Java
alexmacan 2 6,444 Último mensaje 18 Diciembre 2009, 20:10 pm
por alexmacan
Decimales en vb6
Programación Visual Basic
myj03 3 2,556 Último mensaje 12 Abril 2013, 14:08 pm
por 79137913
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines