2011-11-01 15 views
97

Ésta es una de Java bastante simple (aunque probablemente aplicables a toda la programación) pregunta:Math.random() explicó

Math.random() devuelve un número de cero a uno.

Si quiero devolver un número entero de cero a cien, lo haría:

(int) Math.floor(Math.random() * 101) 

De uno a cien, lo haría:

(int) Math.ceil(Math.random() * 100) 

Pero lo que si quería para hacerlo de tres a cinco? Cómo será siguiente declaración:

(int) Math.random() * 5 + 3 

que sé sobre nextInt() en java.lang.util.Random. Pero quiero aprender a hacer esto con Math.random().

+8

BTW: el rango es de 0,0 inclusive a 1,0 exclusivo (no se obtendrá 1,0 por vez) Usar nextInt() es una opción mucho mejor, no solo es más simple sino también mucho más rápido. –

+1

El uso de 'Math.ceil' es incorrecto, da el resultado incorrecto cuando' Math.random() 'devuelve' 0'. – starblue

+0

Para [3,5]: '(int) Math.floor (Math.random() * 3) + 3' –

Respuesta

130
int randomWithRange(int min, int max) 
{ 
    int range = (max - min) + 1;  
    return (int)(Math.random() * range) + min; 
} 

salida de randomWithRange(2, 5) 10 veces:

5 
2 
3 
3 
2 
4 
4 
4 
5 
4 

Los límites son inclusivos, es decir, [2,5], y min debe ser inferior a max en el ejemplo anterior.

EDIT: Si alguien iba a tratar de ser estúpida y revertir min y max, que podría cambiar el código para:

int randomWithRange(int min, int max) 
{ 
    int range = Math.abs(max - min) + 1;  
    return (int)(Math.random() * range) + (min <= max ? min : max); 
} 

Edit2: Por su pregunta sobre double s, es sólo :

double randomWithRange(double min, double max) 
{ 
    double range = (max - min);  
    return (Math.random() * range) + min; 
} 

Y de nuevo si quieres a prueba de idiotas que es sólo:

double randomWithRange(double min, double max) 
{ 
    double range = Math.abs(max - min);  
    return (Math.random() * range) + (min <= max ? min : max); 
} 
+1

¿Qué pasa si no usas '(int)' y quieres que devuelva un 'doble'? – switz

+0

Si desea duplicar, simplemente reemplace el 'int's con' double's (y la conversión de tipo no es necesaria). Supuse que querías 'int's pero agregaré a mi publicación. – AusCBloke

+1

En realidad, con 'double's eliminar el' + 1' también porque 'Math.random()' no se está truncando. Sin embargo, el rango será [min, max) ya que 'Math.random'" Devuelve un valor doble con un signo positivo, mayor o igual que 0.0 y menor que 1.0. " Habría una posibilidad mínima de que el número sea exactamente 'máximo 'de todos modos, incluso si fuera posible. – AusCBloke

17

La clase Random de Java ubicada en el paquete java.util servirá para su propósito mejor. Tiene algunos métodos nextInt() que devuelven un número entero. El que toma un argumento int generará un número entre 0 y ese int, este último no incluido.

+0

He actualizado mi pregunta, me gustaría saber cómo hacerlo con 'Math.random()'. Gracias. – switz

+0

+1 para la forma más confiable de hacerlo. – trashgod

36

Si desea generar un número de 0 a 100, entonces el código se vería así:

(int)(Math.random() * 101); 

para generar un número de 10 a 20:

(int)(Math.random() * 11 + 10); 

En general caso:

(int)(Math.random() * ((upperbound - lowerbound) + 1) + lowerbound); 

(donde lowerbound es inclusivo y upperbound exclu sive).

La inclusión o exclusión de Uppderbound depende de su elección. Digamos Rango = (Uppderbound-lowerbound) +1 luego el Uppderbound es Inclusivo.pero si el rango = (Uppderbound-lowerbound), el Uppderbound es exclusivo. Ej .: Si quiero un entero b/w 3-5, entonces si el rango es (5-3) +1, entonces 5 es inclusivo, si el rango es justo (5-3), entonces 5 es Exclusivo.

+2

exclusivo 'upperbound'? Creo que será inclusivo – vidit

+0

@vidit es exclusivo –

Cuestiones relacionadas