2011-11-03 12 views
10

¿Por qué alguien llamaría Math.floor en un resultado Math.random? Lo he visto usado como:¿Por qué debería combinar Math.floor con Math.random?

Math.floor(Math.random() * num); 

¿Puede alguien explicar por favor?

+0

¿Quién es "nosotros"? :) –

+0

@quixoto Porque vi este código muchas veces, es por eso que dije "nosotros", lo cambiaré de todos modos> –

+1

No estaba criticando su redacción. Es útil para este tipo de preguntas afirmar que se trata de algo que se ve a menudo, o se ve a menudo en tal tipo de código, para que las personas tengan contexto y sepan cómo responderlo mejor. –

Respuesta

17

Math.random devuelve un número de punto flotante entre 0 y 1.

Devuelve una de punto flotante, número pseudo-aleatorio en el rango [0, 1), es decir, de 0 (incluido) hasta, pero sin incluir, 1 (exclusivo), que luego puede escalar al rango deseado.

Al multiplicar esto por n se obtiene un número de coma flotante entre 0 (inclusive) yn (exclusivo).

Math.floor se utiliza entonces para convertir este número en coma flotante a una número entero entre 0 y n - 1 (inclusive).

1

Math.random() le dará un decimal largo y aleatorio. Lo que se suele hacer es multiplicar ese decimal por 10, 100, 1000, etc. para obtener un número entero al azar. Sin embargo, como ese decimal es tan largo, para obtener un número entero absoluto, usa Math.floor() para redondear ese número.

1

¿Por qué combinaría Math.floor con Math.random?

Los combina porque de lo contrario devolvería un flotador. Al usar Math.floor, se asegura de que sea un número entero dentro del rango especificado.

Math.random devuelve un piso entre 0 y 1. Multiplicarlo por su num o rango máximo le da un valor con un máximo de ese número (1 * num). Entonces, de nuevo, Math.floor simplemente está forzando que sea un número entero.


Detrás del escenario:

NÚMERO DE AZAR -> 0.35 -> Multiplicado por max (num) de 11 -> Obtiene 3.85 -> Math.floor (3,85) -> 3.


Tenga en cuenta, num es el MAX + 1. El ajuste num a 5 solo generará los números 1-4.


Se puede extraer de este enlace para más información: http://www.javascriptkit.com/javatutors/randomnum.shtml

Tada :)

0

Math.random() vuelve algo así como 0.8747230430599302 entre [0,1)

Utilizamos .floor a redondearlo hasta el entero más cercano.Por ejemplo:

Math.random()*5 == 2.5889716914389282 Esto genera un número entre [0,5).

Math.floor(Math.random()*5) == 2 //in this scenario genera un número entre [0,4]

12

Rompiendo Math.floor(Math.Random() * num) abajo en su piezas individuales y explicar cada pieza, se obtiene lo siguiente:

Math.random() le da un número decimal aleatorio entre 0 y 1 , incluyendo 0, pero sin incluir 1. Por lo tanto, podría darle algo como 0.38548569372.

Math.random() * num le da un número decimal aleatorio entre 0 y num, incluyendo 0, pero sin incluir num. Entonces, si num era 10, podría darle 3.8548569372.

Math.floor(Math.random() * num)) le da un número entero al azar entre 0 y num, incluyendo 0, pero sin incluir num. Por lo tanto, podría darle 3.

Math.floor() trunca el número decimal solo en la parte entera. Un número entero aleatorio a menudo se usa para obtener un valor aleatorio de una matriz (que debe ser un número entero).

+0

Perdón por hi-jack, pero para aclarar ... ¿el piso se redondea hacia abajo, mientras el techo se redondea hacia arriba? – Myles

+1

@Myles - 'Math.floor()' te da el siguiente entero más bajo. 'Math.ceil()' te da el siguiente entero más alto. 'Math.round()' examina el valor y le proporciona el siguiente número entero más bajo o el siguiente más alto, según cuál sea más cercano. En el futuro, el [sitio de MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor) es una excelente referencia para todos estos tipos de preguntas. – jfriend00

0

Se usa para obtener un número entero entero al azar entre 0 y (max - 1).

Por otro lado, es más rápido usar | 0 como en

const randomInt = Math.random() * num | 0; 

El | 0 es un binario o de 0 cual el JavaScript spec efectivamente dice que el resultado se convierte en un entero antes de la | sucede. Tenga en cuenta que | 0 no es lo mismo que Math.floor. | 0 redondea a 0 mientras que Math.floor redondea hacia abajo.

  | 0 Math.floor   
------+------+------------ 
    2.5 | 2 | 2 
    1.5 | 1 | 1 
    0.5 | 0 | 0 
-0.5 | 0 | -1 
-1.5 | =1 | -2 
-2.5 | -2 | -3 
0
var num = Math.floor(Math.random() * 1000); // e.g. 885 

var flNum = Math.random() * 1000; //e.g. 885.9936205333221 

Trate Math.random() * 1000, por ejemplo, es posible obtener algo como esto: 885.9936205333221, en muchos casos es necesario un número redondo, por lo que muchos desarrolladores utilizan con Math.floor o Matemáticas .ceil para obtener un entero como 885, si en su caso, no le importa tener un número flotante, déjelo como está ...

Para obtener más información acerca de cómo funciona Math.floor, consulte este enlace:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Math/floor

Cuestiones relacionadas