2012-06-27 17 views
6

Gdy masz Math.floor(Math.random()*10)+1, należy wybrać liczbę losową z zakresu od 1 do 10 z tego, co rozumiem.Math.floor (Math.random()) co robi +1?

Jednak po zmianie +1 na dowolną liczbę wyższą lub niższą niż 1 otrzymuję taki sam wynik. Dlaczego to? Co dokładnie oznacza +1?

+2

Jeśli dodać coś więcej niż '+ 1' i nadal kończy się liczbami od 1 do 10 coś jest bardzo źle. –

+0

Co dokładnie masz na myśli przez "ten sam wynik"? czy możesz wyjaśnić lub opublikować wyniki? –

+0

(Aby wyjaśnić - jeśli * zawsze * i * tylko * otrzymasz liczby od 1 do 10. Oczywiście każdy dany przebieg może dać tylko 1-10, ale z czasem prawie to na pewno * nie * się stanie.) –

Odpowiedz

8

The generator liczb losowych wytwarza wartość w zakresie 0.0 < = n < 1.0. Jeśli chcesz uzyskać liczbę od 1 do czegoś, musisz zastosować przesunięcie +1.

Generalnie można użyć:

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

To będzie generować wartości pomiędzy M i M + N - 1.

demo Fiddle

+3

nie do końca prawdziwe: ze względu na "Math.floor" między M i M + N-1. Musisz 'Math.round', aby mieć liczby między M i M + N. Jednak w tym przypadku rozproszenie nie jest równe, ponieważ M i M + N mają tylko połowę szansy na rzucenie. – Christoph

+0

dla zabawy: http://jsfiddle.net/poikl/x5gSz/ – Christoph

+0

Masz rację. Przez "między" mam na myśli "do, ale nie wliczając", co jest wartościami technicznymi w zakresie M <= n tadman

3

Math.random() generuje losową liczbę pomiędzy 0 a 1.

Dlatego Math.random()*10 generuje losową liczbę od 0 do 10, a (Math.random()*10)+1 liczbę pomiędzy 1 i 11

Math.floor() krople dziesiętną tej liczby i sprawia, że ​​jest liczbą całkowitą od 0 do 10.

widać sekwencyjny progresji logiki here

+4

'Math.random()' może także generować '0.9999 ...'. Aby być dokładnym, 'Math.random()' generuje liczbę pomiędzy (włącznie) 0 i (z wyłączeniem) 1. –

+0

Aby to sprawdzić, uruchomiłem 'Math.random()' cztery razy. Nie tylko jasno pokazuje, że można uzyskać wartość zmiennoprzecinkową powyżej '0,9', ale także, że możesz [nigdy nie być pewnym losowości] (http://dilbert.com/strips/comic/2001-10-25/): 0.9491507810734872/ 0.9815085749153463/ 0.7040373403047864/ 0.9940599762680827 –

+0

Dobra wskazówka - odpowiednio zaktualizowana odpowiedź. I tak, ale cokolwiek jest naprawdę "losowe"! – jacktheripper

0

podstawowe:

(random() >= 0) zawsze true

(random() < 1) zawsze true

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

maksymalna:

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

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

Minimum:

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

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

maksymalna Runda:

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

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

2

Ogólna ilość wynosi od 1 do 10

  • Math.random() generuje liczbę między 0 a 1 (z wieloma miejscami dziesiętnymi).

etc: Math.random() [losowo powrotu: +0,19157057767733932]
(liczba ta będzie jeszcze wiele miejsc po przecinku)

Aby otrzymać losową liczbę całkowitą, należy pomnożyć losowo generowane przez numer 10.

itp
Math.random() * 10 = [losowo powrotu: 2,9757621488533914]

  • Ponieważ liczba będzie nadal zawierać wiele miejsc po przecinku, należy użyć floor() metody, aby zaokrąglić liczbę w dół/najbliższą liczbę całkowitą, da to wartość ua między 0 a 9. Następnie można dodać 1, aby była liczbą między 1 a 10.

etc:
Math.floor (0,6)   [return 0]
Math.floor (0,6) + 1   [powrót 1]