2012-06-27 26 views
6

Cuando tiene Math.floor(Math.random()*10)+1 se supone que debe elegir un número aleatorio entre 1-10 según mi entender.Math.floor (Math.random()) ¿Qué hace +1 en realidad?

Sin embargo, cuando cambio el +1 a cualquier número superior o inferior a 1 obtengo el mismo resultado. ¿Por qué es esto? ¿Qué significa exactamente el +1?

+2

Si añade algo más de '+ 1' y todavía terminas con números entre 1-10 algo está muy mal. –

+0

¿Qué quiere decir exactamente con "el mismo resultado"? ¿Puedes aclarar o publicar alguna salida? –

+0

(Para aclarar, si * siempre * y * solo * obtiene números entre 1 y 10. Obviamente, cualquier ejecución dada solo puede producir de 1 a 10, pero con el tiempo, es casi seguro que * no * será el caso). –

Respuesta

8

el generador de números aleatorios produce un valor en el rango de 0.0 < = n < 1.0. Si desea un número entre 1 y algo, deberá aplicar un desplazamiento de +1.

general que puede utilizar:

Math.floor(Math.random() * N) + M 

Esto generará valores entre M y M + N - 1.

demo Fiddle

+3

no del todo cierto: debido a 'Math.floor' está entre M y M + N-1. Necesitas 'Math.round' para tener números entre M y M + N. Sin embargo, en ese caso, la distribución no es igual, ya que M y M + N solo tienen la mitad de posibilidades de rodar. – Christoph

+0

solo por diversión: http://jsfiddle.net/poikl/x5gSz/ – Christoph

+0

Estás en lo correcto. Por "entre" quiero decir "hasta, pero sin incluir", que es técnicamente valores en el rango M <= n tadman

3

Math.random() genera un número aleatorio entre 0 y 1.

Por lo tanto Math.random()*10 genera un número aleatorio entre 0 y 10, y (Math.random()*10)+1 un número entre 1 y 11.

Math.floor() deja caer el decimal de este número, y hace que sea un número entero de 0 a 10.

se puede ver una progresión secuencial de la lógica here

+4

'Math.random()' también puede generar '0.9999 ...'. Para ser exactos, 'Math.random()' genera un número entre (incluyendo) 0 y (excluyendo) 1. –

+0

Para verificar, ejecuté 'Math.random()' cuatro veces. No solo muestra claramente que se puede obtener una flotación superior a '0,9', sino que también se puede [nunca estar seguro de la aleatoriedad] (http://dilbert.com/strips/comic/2001-10-25/): 0.9491507810734872/ 0.9815085749153463/ 0.7040373403047864/ 0.9940599762680827 –

+0

Buen punto - respuesta actualizada en consecuencia. Y sí, pero ¿hay algo verdaderamente "aleatorio"? – jacktheripper

0

básica:

(random() >= 0) siempre true

(random() < 1) siempre true

(Math.floor(random()) == 0) siempre true

máxima:

(Math.floor(random() * 10) >= 0) siempre true

(Math.floor(random() * 10) < 10) siempre true

mínima:

(Math.floor(random() * 10) + 1 >= 1) siempre true

(Math.floor(random() * 10) + 1 < 11) siempre true

Max redonda:

(Math.round(random() * 10, 0) >= 0) siempre true

(Math.round(random() * 10, 0) <= 10) siempre true

2

número entero entre 1 y 10

  • Math.random() genera número entre 0 y 1 (con muchos decimales).

etc: math.random() [regresar al azar: ,19157057767733932]
(este número será todavía tienen muchos lugares decimales)

Para obtener un número entero aleatorio, es necesario multiplicar al azar número generado por 10.

etc
math.random() * 10 = [regreso al azar: 2,9757621488533914]

  • Dado que el número aún tendrá muchos decimales, use floor() método para redondear un número hacia abajo/entero más cercano, esto dará un valor entre 0 y 9. Entonces, puede agregar 1 para convertirlo en un número entre 1 y 10.

etc:
Math.floor (0,6)   [para volver 0]
Math.floor (0,6) + 1   [para volver 1]

Cuestiones relacionadas