Autor
|
Tema: Random de 0 a 10 con dos decimales (Leído 10,043 veces)
|
Baal_30
Desconectado
Mensajes: 248
|
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
|
y si generas un int entre 0 y 1000 y luego divides entre 100?
|
|
|
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
Mensajes: 445
Grandes conocimientos engendran grandes dudas
|
Pongo el código de lo que dijo @Engel lex int n1 = (int)(random.nextDouble()*1001); // Se genera un numero desde el 0 al 1000 double n2 = (double)n1/100; // Se divide el numero entre 100
(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: double decimal = rnd.nextDobule(); int cantidad = 1001; int menor = 500; 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
Mensajes: 248
|
ummm que grande, no había pensado en lo de generar un nextInt(1001) y luego entre 100 Nac-ho, el primer código, se podría "simplificar" así : int n1 = random.nextInt(1001); double n2 = n1/100;
Gracias a los dos ¡!
|
|
|
En línea
|
«La suerte es el cuidado de los detalles». -Winston Churchill
|
|
|
Usuario Invitado
Desconectado
Mensajes: 625
|
Incluso de puede simplificar aun "más" : 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.
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
Mensajes: 248
|
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
Mensajes: 445
Grandes conocimientos engendran grandes dudas
|
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)
|
|
|
En línea
|
|
|
|
Usuario Invitado
Desconectado
Mensajes: 625
|
@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: import java.util.Random; import java.text.DecimalFormat; public class DecimalNumberGenerator { private final static int NUMBER_MULTIPLICITY = 10; public static Double buildNumberWithTwoDecimals () { return generateNumber(); } private static Double generateNumber () { double generatedNumber = randomNumberGenerator.nextDouble() * NUMBER_MULTIPLICITY; String formattedNumber = twoDecimalsFormatter. format(generatedNumber ); // es necesario porque DecimalFormat usa el delimitador decimal "," formattedNumber = formattedNumber.replace("," , "."); return Double. parseDouble(formattedNumber ); } }
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
Mensajes: 248
|
@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: import java.util.Random; import java.text.DecimalFormat; public class DecimalNumberGenerator { private final static int NUMBER_MULTIPLICITY = 10; public static Double buildNumberWithTwoDecimals () { return generateNumber(); } private static Double generateNumber () { double generatedNumber = randomNumberGenerator.nextDouble() * NUMBER_MULTIPLICITY; String formattedNumber = twoDecimalsFormatter. format(generatedNumber ); // es necesario porque DecimalFormat usa el delimitador decimal "," formattedNumber = formattedNumber.replace("," , "."); return Double. parseDouble(formattedNumber ); } }
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 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
Mensajes: 625
|
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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema con decimales
Programación Visual Basic
|
dekland
|
5
|
2,739
|
3 Marzo 2006, 19:20 pm
por dekland
|
|
|
decimales en VB
Programación Visual Basic
|
kakinets
|
1
|
1,812
|
2 Junio 2007, 01:36 am
por <?BRoWLi?>
|
|
|
Ayuda con uso de decimales
.NET (C#, VB.NET, ASP)
|
eliezeralpr
|
4
|
5,049
|
27 Abril 2009, 23:02 pm
por AntonioMeucci
|
|
|
Decimales y Redondeo
Java
|
alexmacan
|
2
|
6,628
|
18 Diciembre 2009, 20:10 pm
por alexmacan
|
|
|
Decimales en vb6
Programación Visual Basic
|
myj03
|
3
|
2,766
|
12 Abril 2013, 14:08 pm
por 79137913
|
|