2012-06-27 13 views
6

Se si dispone di Math.floor(Math.random()*10)+1, è necessario selezionare un numero casuale compreso tra 1 e 10 da quello che ho capito.Math.floor (Math.random()) cosa fa effettivamente +1?

Tuttavia, quando cambio lo +1 su un numero qualsiasi più alto o più basso di 1 ottengo lo stesso risultato. Perchè è questo? Cosa significa esattamente il +1?

+2

Se si aggiunge qualcosa di più '+ 1' e ancora finisci con numeri tra 1-10 qualcosa è molto sbagliato. –

+0

Cosa intendi esattamente per "stesso risultato"? puoi chiarire o postare qualche output? –

+0

(Per chiarire - se * sempre * e * solo * ottengono numeri compresi tra 1 e 10. Ovviamente una determinata corsa potrebbe produrre solo 1-10, ma nel tempo, quasi certamente * non * si verificherà.) –

risposta

8

l' Il generatore di numeri casuali produce un valore nell'intervallo 0,0 < = n < 1.0. Se si desidera un numero compreso tra 1 e qualcosa, è necessario applicare uno scostamento +1.

Generalmente si possono usare:

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

Questo genererà valori compresi tra M e M + N - 1.

demo Fiddle

+3

non completamente vero: a causa di 'Math.floor' è tra M e M + N-1. È necessario 'Math.round' per avere numeri tra M e M + N. Tuttavia, in questo caso la distrubuzione non è uguale, poiché M e M + N hanno solo metà delle possibilità di rotolare. – Christoph

+0

solo per divertimento: http://jsfiddle.net/poikl/x5gSz/ – Christoph

+0

Hai ragione. Per "tra" intendo "fino a ma non includendo", che è tecnicamente valori nell'intervallo M <= n tadman

3

Math.random() genera un numero casuale tra 0 e 1.

Pertanto Math.random()*10 genera un numero casuale compreso tra 0 e 10, e (Math.random()*10)+1 un numero compreso tra 1 e 11.

Math.floor() gocce decimale di questo numero, e lo rende un intero da 0 a 10.

si può vedere una progressione sequenziale della logica here

+4

'Math.random()' può anche generare '0.9999 ...'. Per essere precisi, 'Math.random()' genera un numero compreso tra (compreso) 0 e (escluso) 1. –

+0

Per verificare, ho eseguito 'Math.random()' quattro volte. Non solo mostra chiaramente che è possibile ottenere un valore al di sopra di '0.9', ma anche che puoi [non essere mai sicuro della casualità] (http://dilbert.com/strips/comic/2001-10-25/): 0.9491507810734872/ 0.9815085749153463/ 0.7040373403047864/ 0.9940599762680827 –

+0

Buon punto - risposta aggiornata di conseguenza. E sì, ma è sempre qualcosa di veramente "casuale"! – jacktheripper

0

base:

(random() >= 0) sempre true

(random() < 1) sempre true

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

massima:

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

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

minima:

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

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

Max rotonda:

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

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

2

numero intero è compreso tra 1 e 10

  • Math.random() genera numero compreso tra 0 e 1 (con molti decimali).

ecc: Math.random() [casualmente tornare: 0,19157057767733932]
(questo numero avrà ancora tanti decimali)

Per ottenere un numero intero a caso, è necessario moltiplicare casuale numero generato da 10.

ecc
Math.random() * 10 = [a caso di ritorno: 2,9757621488533914]

  • Poiché il numero avrà ancora molte posizioni decimali, utilizzare il metodo floor() per arrotondare un numero inferiore/numero più vicino, questo darà un valore compreso tra 0 e 9. Quindi, è possibile aggiungere 1 per renderlo un numero compreso tra 1 e 10.

ecc:
Math.floor (0,6)   [return 0]
Math.floor (0,6) + 1   [ritorno 1]

Problemi correlati