întreg aleatoriu javascript. Numere aleatorii

De foarte multe ori, calculele în JavaScript nu dau exact rezultatele pe care ni le dorim. Desigur, putem face ce vrem cu numere - rotunjim în sus sau în jos, setați intervale, tăiați numerele inutile la un anumit număr de zecimale, totul depinde de ce doriți să faceți cu acest număr în viitor. De ce este necesară rotunjirea? Unul dintre aspectele interesante ale JavaScript este că de fapt nu stochează numere întregi, lucrăm imediat cu numere în virgulă mobilă. Acest lucru, combinat cu faptul că multe valori fracționale nu pot fi exprimate într-un număr finit de zecimale, în JavaScript putem obține rezultate ca acestea:

0.1 * 0.2; > 0.020000000000000004 0.3 - 0.1 > 0.19999999999999998
În scopuri practice, această inexactitate nu contează, în cazul nostru vorbim despre o eroare în chintilioane de piese, totuși, acest lucru îi poate dezamăgi pe unii. Putem primi câteva rezultat ciudatși atunci când lucrați cu numere care reprezintă valori monetare, procente sau dimensiuni de fișiere. Pentru a corecta aceste inexactități, trebuie doar să putem rotunji rezultatele și este suficient să setăm precizia zecimală.

Rotunjirea numerelor are uz practic, este posibil să manipulăm un număr într-un anumit interval, de exemplu, dorim să rotunjim valoarea la cel mai apropiat număr întreg, în loc să lucrăm numai cu parte zecimală.

Rotunjirea numerelor zecimale Pentru a tăia numar decimal, utilizați metoda toFixed sau toPrecision. Ambele au un singur argument care specifică, respectiv, câte cifre semnificative (adică numărul total de cifre utilizate în număr) sau zecimale (numărul după virgulă) rezultatul ar trebui să includă:
  • Dacă un argument nu este definit pentru toFixed(), atunci acesta va fi implicit egal cu zero, ceea ce înseamnă 0 zecimale, argumentul are o valoare maximă de 20.
  • Dacă toPrecision nu i se oferă niciun argument, numărul este lăsat neatins
  • fie randNum = 6,25; randNum.toFixed(); > „6” Math.PI.toPrecision(1); > "3" randNum = 87,335; randNum.toFixed(2); > "87,33" randNum = 87,337; randNum.toPrecision(3); > "87,3"
    Ambele metode toFixed() și toPrecision() returnează o reprezentare șir a rezultatului, nu un număr. Aceasta înseamnă că atunci când însumăm o valoare rotunjită cu randNum, va produce o concatenare de șiruri de caractere mai degrabă decât o sumă de numere:

    Fie randNum = 6,25; let rounded = randNum.toFixed(); // "6" console.log(randNum + rotunjit); > „6.256”
    Dacă vrei ca rezultatul să fie tip numeric date, atunci va trebui să aplicați parseFloat:

    Fie randNum = 6,25; let rounded = parseFloat(randNum.toFixed(1)); console.log(rotunjit); > 6.3
    Vă rugăm să rețineți că valorile de 5 sunt rotunjite, cu excepția cazurilor rare.

    Metodele toFixed() și toPrecision() sunt utile deoarece nu pot doar decupa parte fracționată, dar și pentru a adăuga zecimale, ceea ce este convenabil atunci când lucrați cu moneda:

    Let wholeNum = 1 let dollarsCents = wholeNum.toFixed(2); console.log(dollarsCents); > „1.00”
    Rețineți că toPrecision va produce rezultatul în notație științifică dacă numărul de numere întregi este mai mare decât precizia în sine:

    Fie num = 123,435 num.toPrecision(2); > „1.2e+2”

    Cum să evitați erorile de rotunjire cu zecimale În unele cazuri, toFixed și toPrecision rotunjesc valoarea 5 în jos și în sus:

    Fie numTest = 1,005; numTest.toFixed(2); > „1.00”
    Rezultatul calculului de mai sus ar fi trebuit să fie 1,01, nu 1. Dacă doriți să evitați o eroare similară, putem folosi soluția propusă de Jack L Moore, care folosește numere exponențiale pentru calcul:

    Funcția rotund(valoare, zecimale) ( returnează Număr(Math.round(valoare+"e"+zecimale)+"e-"+zecimale); )
    Acum:

    Rotunzi (1,005,2); > 1.01
    Dacă doriți o soluție mai robustă decât cea prezentată mai sus, puteți merge la MDN.

    Rotunjirea epsilonului automat O metodă alternativă pentru rotunjirea numerelor zecimale a fost introdusă în ES6. Rotunjirea epsilonului mașinii oferă o marjă rezonabilă de eroare atunci când se compară două numere în virgulă mobilă. Fără rotunjire, comparațiile pot produce rezultate similare cu următoarele:

    0,1 + 0,2 === 0,3 > fals
    Folosim Math.EPSILON în funcția noastră pentru a obține o comparație validă:

    Funcția epsEqu(x, y) ( returnează Math.abs(x - y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }
    Funcția are două argumente: primul este calculul curent, al doilea este rezultatul așteptat. Acesta returnează o comparație a celor două:

    EpsEqu(0,1 + 0,2, 0,3) > adevărat
    Toate browserele moderne acceptă deja ES6 functii matematice dar dacă doriți suport în browsere precum IE 11, utilizați polyfills.

    Tăierea părții fracționale Toate metodele prezentate mai sus se pot rotunji la numere zecimale. Pentru a reduce pur și simplu un număr la două zecimale, trebuie mai întâi să-l înmulțiți cu 100 și apoi să împărțiți rezultatul rezultat la 100:

    Funcție trunchiat(num) ( return Math.trunc(num * 100) / 100; ) trunchiat(3.1416) > 3.14
    Dacă doriți să adaptați metoda la orice număr de zecimale, puteți utiliza negația dublă pe biți:

    Funcția trunchiată(num, decimalPlaces) (let numPowerConverter = Math.pow(10, decimalPlaces); return ~~(num * numPowerConverter)/numPowerConverter; )
    Acum:

    Fie randInt = 35,874993; trunchiat(randInt,3); > 35.874

    Rotunjirea la cel mai apropiat număr Pentru a rotunji un număr zecimal la cel mai apropiat număr în sus sau în jos, oricare dintre ele ne aflăm cel mai aproape, utilizați Math.round():

    Math.round(4.3) > 4 Math.round(4.5) > 5
    Rețineți că „jumătate din valoare”, 0,5 este rotunjit la latura mare conform regulilor matematicii.

    Rotunjirea în jos la cel mai apropiat număr întreg Dacă doriți să rotunjiți întotdeauna în jos, utilizați Math.floor:

    Math.floor(42,23); > 42 Math.floor(36,93); > 36
    Vă rugăm să rețineți că rotunjirea în jos funcționează pentru toate numerele, inclusiv pentru numerele negative. Imaginați-vă un zgârie-nori cu un număr infinit de etaje, inclusiv etaje la nivelul de jos (reprezentând numere negative). Dacă ești într-un lift nivel inferiorîntre 2 și 3 (care reprezintă o valoare de -2,5), Math.floor vă va duce la -3:

    Math.floor(-2,5); > -3
    Dar daca vrei sa eviti situație similară, utilizați Math.trunc , acceptat în toate browsere moderne(cu excepția IE/Edge):

    Math.trunc(-41,43); > -41
    Pe MDN veți găsi un polyfill care va oferi suport pentru Math.trunc în browsere și IE/Edge.

    Rotunjirea la cel mai apropiat număr întreg Pe de altă parte, dacă întotdeauna trebuie să rotunjiți în sus, utilizați Math.ceil. Din nou, amintiți-vă de liftul infinit: Math.ceil va merge întotdeauna „în sus”, indiferent dacă numărul este negativ sau nu:

    Math.ceil(42,23); > 43 Math.ceil(36,93); > 37 Math.ceil(-36,93); > -36

    Rotunjirea în sus/în jos la numărul necesar Dacă dorim să rotunjim la cel mai apropiat multiplu de 5, cel mai simplu mod este să creăm o funcție care împarte numărul la 5, îl rotunjește și apoi îl înmulțește cu aceeași sumă:

    Funcția roundTo5(num) ( returnează Math.round(num/5)*5; )
    Acum:

    RoundTo5(11); > 10
    Dacă doriți să rotunjiți la multipli ai valorii dvs., folosim mai mult functia generala, trecând în ea valoarea initialași multiple:

    Funcția roundToMultiple(num, multiple) ( returnează Math.round(num/multiple)*multiple; )
    Acum:

    Fie initialNumber = 11; fie multiplu = 10; roundToMultiple(initialNumber, multiple); > 10;

    Fixarea unui număr într-un interval Există multe cazuri în care dorim să obținem o valoare a lui x care se află într-un interval. De exemplu, s-ar putea să avem nevoie de o valoare între 1 și 100, dar am ajuns la o valoare de 123. Pentru a remedia acest lucru, putem folosi min (returnează cel mai mic dintr-un set de numere) și max (returnează cel mai mare dintre orice set). de numere). În exemplul nostru, intervalul este de la 1 la 100:

    Fie lowBound = 1; lasă highBound = 100; fie numInput = 123; let clamped = Math.max(lowBound, Math.min(numInput, highBound)); console.log(blocat); > 100;
    Din nou, putem reutiliza operația și înfășura totul într-o funcție, folosind soluția propusă de Daniel X. Moore:

    Number.prototype.clamp = function(min, max) ( return Math.min(Math.max(this, min), max); );
    Acum:

    NumInput.clamp(lowBound, highBound); > 100;

    Rotunjirea Gaussă Rotunjirea Gauss, cunoscută și sub denumirea de rotunjire bancară, implică rotunjirea la cel mai apropiat număr par. Această metodă de rotunjire funcționează fără erori statistice. Cea mai bună decizie a fost sugerat de Tim Down:

    Funcția gaussRound(num, decimalPlaces) ( fie d = decimalPlaces || 0, m = Math.pow(10, d), n = +(d ? num * m: num).toFixed(8), i = Math.floor (n), f = n - i, e = 1e-8, r = (f > 0,5 - e && f< 0.5 + e) ? ((i % 2 == 0) ? i: i + 1) : Math.round(n); return d ? r / m: r; }
    Acum:

    GaussRound(2,5) > 2 gaussRound(3,5) > 4 gaussRound(2,57,1) > 2,6
    Decimală în CSS:

    Deoarece JavaScript este adesea folosit pentru a crea mapări poziționale pentru elementele HTML, s-ar putea să vă întrebați ce s-ar întâmpla dacă am genera valori zecimale pentru elementele noastre:

    #box ( lățime: 63,667731993px; )
    Vestea bună este că browserele moderne vor respecta valorile zecimale în model bloc, inclusiv unități procentuale sau pixeli.

    Sortarea De foarte multe ori trebuie să sortăm unele elemente, de exemplu, avem o serie de înregistrări de joc și trebuie organizate în ordinea descrescătoare a rangului jucătorului. Din pacate, metoda standard sort() are câteva limitări surprinzătoare: funcționează bine cu cuvintele englezești obișnuite, dar se defectează imediat când întâlnește numere, caractere unice sau cuvinte majuscule. Filtrează după ordine alfabetică S-ar părea că sortarea unei matrice în ordine alfabetică ar trebui să fie o sarcină simplă:

    Lăsați fructe = [„dovleac”, „caise”, „gustalupe”]; fruct.sort(); > „caisă”, „dovleac”, „gustalup”]
    Cu toate acestea, ne confruntăm cu o problemă de îndată ce unul dintre elemente este cu majuscule:

    Lasa fructe = ["dovleac", "caise", "Cantalope"]; fruct.sort(); > „Cantalup”, „caise”, „dovleac”]
    Acest lucru se datorează faptului că, în mod implicit, sortatorul compară primul caracter reprezentat în Unicode. Unicode este cod unic pentru orice simbol, indiferent de platformă, indiferent de program, indiferent de limbă. De exemplu, dacă te uiți la tabelul de coduri, caracterul „a” are valoarea U+0061 (in sistem hexazecimal 0x61), în timp ce caracterul „C” are codul U+0043 (0x43), care apare mai devreme în tabelul Unicode decât caracterul „a”.

    Pentru a sorta o matrice care poate conține primele litere mixte cu majuscule, trebuie fie să convertim temporar toate elementele în minuscule, fie să definim ordinea noastră de sortare folosind metoda localeCompare() cu unele argumente. De regulă, pentru un astfel de caz, este mai bine să creați imediat o funcție pentru utilizare repetată:

    Funcția alphaSort(arr) ( arr.sort(function (a, b) ( return a.localeCompare(b, "en", ("sensibilitate": "bază")); )); ) let fruit = ["dovleac butternut „, „caisă”, „Cantalup”]; alphaSort(fructe) >
    Dacă doriți ca matricea să fie sortată în ordine alfabetică inversă, schimbați pur și simplu pozițiile lui a și b în funcție:

    Funcția alphaSort(arr) ( arr.sort(function (a, b) ( return b.localeCompare(a, "en", ("sensibilitate": "bază")); )); ) let fruit = ["dovleac butternut „, „caisă”, „Cantalup”]; alphaSort(fructe) > ["Cantalupe", "dovleac", "caise"]
    Aici este de remarcat faptul că localeCompare este folosit cu argumente, trebuie să ne amintim, de asemenea, că este suportat de IE11+, pentru versiunile mai vechi de IE, îl putem folosi fără argumente și cu litere mici:

    Funcția caseSort(arr) ( arr.sort(funcție (a, b) ( return a.toLowerCase().localeCompare(b.toLowerCase()); )); ) let fruit = ["dovleac", "caise", "Pepene galben"]; caseSort(fructe) > ["caise", "dovleac", "Cantalupe"]

    Sortare numerică Toate acestea nu se aplică exemplului despre care am vorbit mai sus despre gama de înregistrări de joc. Cu unele matrice numerice, sortarea funcționează bine, dar la un moment dat rezultatul poate fi imprevizibil:

    Fie highScores = ; highScores.sort(); >
    Chestia este că metoda sort() realizează o comparație lexicografică: ceea ce înseamnă că numerele vor fi convertite într-un șir și comparațiile se vor face din nou prin potrivirea primului caracter al acelui șir în ordinea caracterelor din tabelul Unicode. . Prin urmare, trebuie să definim din nou ordinea noastră de sortare:

    Fie highScores = ; highScores.sort(function(a,b) ( return a - b; )); >
    Din nou, pentru a sorta numerele în ordine inversă, schimbați pozițiile lui a și b în funcție.

    Sortarea unei structuri asemănătoare JSON În sfârșit, dacă avem o structură de date asemănătoare JSON reprezentată ca o matrice de înregistrări de joc:

    Fiți scoruri = [ ( „nume”: „Daniel”, „scor”: 21768 ), ( „nume”: „Michael”, „scor”: 33579 ), ( „nume”: „Alison”, „scor”: 38395 ) ];
    În ES6+, puteți utiliza funcții de săgeți:

    Scores.sort((a, b) => b.score - a.score));
    Pentru browserele mai vechi care nu au acest suport:

    Scores.sort(funcție(a, b) ( returnează a.score - b.score ));
    După cum puteți vedea, sortarea în JavaScript este un lucru destul de obscur, sper că aceste exemple vor face viața mai ușoară cumva.

    Lucrul cu funcții de putere Exponentiarea este o operație definită inițial ca rezultat al înmulțirii repetate numar natural pe ea însăși, rădăcina pătrată a lui a este numărul care dă a când este pătrat. Am putea folosi aceste funcții în mod constant în Viata de zi cu zi la lecțiile de matematică, inclusiv calcularea suprafețelor, volumelor sau chiar modelarea fizică.

    În JavaScript, funcția de putere este reprezentată ca Math.pow(), în noul standard ES7 a fost introdusă nou operator exponentiație - " * * ".

    Ridicarea la o putere Pentru a ridica un număr la a n-a putere, utilizați funcția Math.pow(), unde primul argument este numărul care va fi ridicat la putere, al doilea argument este exponentul:

    Math.pow(3,2) > 9
    Această formă de notație înseamnă 3 pătrat, sau 3 × 3, ceea ce duce la rezultatul 9. Un alt exemplu poate fi dat, desigur:

    Math.pow(5,3); > 125
    Adică, 5 cuburi, sau 5 × 5 × 5, este egal cu 125.

    Urmează ECMAScript 7 Versiunea JavaScript, în principiu, putem folosi noul operator de exponențiere propus - * *, această formă de notație poate fi mai descriptivă:

    3 ** 2 > 9
    Pe acest moment Suportul pentru acest operator este destul de limitat, deci utilizarea lui nu este recomandată.

    Funcția de putere poate fi utilă în cele mai multe situatii diferite. Un exemplu simplu, calcularea numărului de secunde într-o oră: Math.pow (60,2).

    Rădăcina pătrată și cubă Math.sqrt() și Math.cbrt() sunt opusul Math.pow(). După cum ne amintim, rădăcina pătrată a lui a este numărul care dă a când este pătrat.

    Math.sqrt(9) > 3
    În același timp, rădăcina cubă a lui a este un număr care dă a atunci când este ridicat la un cub.

    Math.cbrt(125) > 5
    Math.cbrt() a fost introdus doar recent în specificația JavaScript și, prin urmare, este acceptat doar în browserele moderne: Chrome 38+, Firefox și Opera 25+ și Safari 7.1+. Vei observa asta Internet Explorer nu se află pe această listă, dar veți găsi un polyfill pe MDN.

    Exemple Desigur, putem folosi valori non-întregi în una dintre aceste funcții:

    Math.pow(1,25, 2); > 1,5625 Math.cbrt(56,57) > 3,8387991760286138
    Vă rugăm să rețineți că acest lucru funcționează destul de bine și atunci când utilizați valori negative ale argumentelor:

    Math.pow(-5,2) > 25 Math.pow(10,-2) > 0,01
    Cu toate acestea, acest lucru nu va funcționa pentru rădăcina pătrată:

    Math.sqrt(-9) > NaN
    Din analiză matematicăștim că prin număr imaginar înțelegem rădăcinile pătrate ale numere negative. Și asta ne poate conduce la o altă tehnică de lucru cu numere complexe, dar asta este o altă poveste.

    Puteți folosi fracții în Math.pow() pentru a găsi rădăcinile pătrate și cubice ale numerelor. Rădăcină pătrată folosește exponentul 0,5:

    Math.pow(5, 0,5); // = Math.sqrt(5) = 5 ** (1/2) > 2,23606797749979
    Cu toate acestea, din cauza capricilor virgulei mobile, nu puteți ghici exact rezultatul corect:

    Math.pow(2,23606797749979,2) > 5,000000000000001
    În astfel de situații, va trebui să recurgeți la tăierea semnelor din număr sau rotunjirea la o anumită valoare.

    Unii, de din motive necunoscute JavaScript confundă funcția Math.pow() cu Math.exp() , care este o funcție exponențială pentru numere în general. Notă: în Limba engleză„exponent” este tradus ca „exponent”, deci este mai probabil să se aplice vorbitorilor de engleză, deși există denumiri alternative pentru exponent, cum ar fi index, putere.

    Constante matematice Lucrul cu matematica în JavaScript este facilitat de un număr de constante încorporate. Aceste constante sunt proprietăți ale obiectului Math. Este de remarcat faptul că constantele sunt scrise cu majuscule, nu cu notația CamelCase.

    Numai utilizatorii înregistrați pot participa la sondaj. , Vă rog.

    Etichete: Adăugați etichete

    Din punct de vedere tehnic, termenul „generator” numere aleatorii" - acest lucru este absurd, deoarece numerele în sine nu sunt aleatorii. De exemplu, 100 este un număr aleatoriu? Ce zici de 25? Ceea ce înseamnă de fapt acest termen este că creează o secvență de numere care apar la întâmplare. Acest lucru ridică o întrebare mai dificilă: ce este o succesiune de numere aleatoare? Singurul răspuns corect: o succesiune de numere aleatoare este o succesiune în care toate elementele nu au legătură. Această definiție duce la paradoxul că orice secvență poate fi fie aleatorie, fie non-aleatorie, în funcție de modul în care este obținută secvența. De exemplu, rândul următor numere
    1 2 3 4 5 6 7 8 9 0
    a fost primit prin tipar linia de sus tastaturile în ordine, astfel încât secvența nu poate fi considerată generată aleatoriu. Dar ce se întâmplă dacă obții aceeași secvență când scoți mingile de tenis numerotate din butoi. ÎN în acest caz, aceasta este deja o secvență generată aleatoriu. Acest exemplu arată că aleatoritatea unei secvențe depinde de modul în care a fost obținută, nu de ea însăși.

    Amintiți-vă că o secvență de numere generată de computer este deterministă: fiecare număr, cu excepția primului, depinde de numerele dinainte. Din punct de vedere tehnic, aceasta înseamnă că doar o secvență cvasialeatorie de numere poate fi generată de un computer, adică. de fapt ele nu sunt cu adevărat aleatorii. Cu toate acestea, acest lucru este suficient pentru majoritatea sarcinilor și, pentru simplitate, astfel de secvențe vor fi numite aleatoare. O metodă foarte interesantă a fost dezvoltată de John von Neumann; este adesea numit rădăcină pătrată medie. În această metodă, numărul aleatoriu anterior este pătrat, iar apoi cifrele din mijloc sunt extrase din rezultat. De exemplu, dacă creați numere cu trei cifre, iar numărul anterior a fost 121, atunci la pătrat dă rezultatul 14641. Izolarea celor trei cifre din mijloc dă următorul număr aleatoriu 464. Dezavantajul acestei metode este că are un perioadă scurtă de repetiție, numită ciclu. Din acest motiv aceasta metoda nefolosit astăzi. Metode moderne Generarea de numere aleatorii este mult mai dificilă.

    Numere aleatorii în PHP

    PHP are două grupuri de funcții pentru lucrul cu numere aleatorii. Pur extern, ele pot fi distinse prin prefixul mt_ pentru toate funcțiile unuia dintre grupuri.

    Caracteristici depreciate
    funcția rand Returnează un număr întreg între zero și valoarea lui RAND_MAX (care este 32767). Poate avea doi parametri întregi opționali - dacă sunt specificați, se generează un număr aleator de la primul parametru la al doilea.

    Echo rand(); echo rand(1.100); // Dați un număr aleatoriu de la 1 la 100

    Funcția srand. Specifică succesiunea de numere aleatoare produse de funcția rand. Are un parametru întreg - când sensuri diferite Cu acest parametru, rand va produce diferite secvențe de numere. Funcția srand trebuie apelată o singură dată înainte de toate apelurile la funcția rand. Exemplu de utilizare:

    Srand(1288); // Inițializați generatorul de numere aleatoare pentru($i=0; $i