Випадкове число JavaScript. Генерування випадкових цілих чисел у JavaScript у певному діапазоні

Є кілька прикладів:

/** * Returns a random number between min (inclusive) and max (exclusive) */ function getRandomArbitrary(min, max) ( return Math.random() * (max - min) + min; ) /** * Returns a random integer між min (inclusive) and max (inclusive). * Вартість є не меншою, ніж min (або більшою частиною великої не меншої, якщо не буде меншою) і не більшою, ніж max (або не меншою, ніж max = max isn"t an integer). * Using Math.round() will give you a non-uniform distribution! */ function getRandomInt(min, max) (min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1)) + min; )

Тут є логіка за цим. Це просте правило трьох:

Math.random() повертає Number від 0 (включно) до 1 (виняток). Отже, ми маємо такий інтервал:

То підлога n * 10 - ваша відповідь, і якщо вам потрібно , то підлога n * 100 - ваша відповідь і т.д.

Тепер введіть свою роль:

Ви запросили номери серед певного діапазону. (У цьому випадку ви зміщені в цьому діапазоні. - Прийнявши число з , звернувши кубик, ви пристраститесь до , але все ж таки це випадковий випадок, якщо і тільки якщо смерть неупереджена.)

Отже, розглянемо ваш діапазон == кількість елементів діапазону = 247 - 78 + 1 = 170; (оскільки обидві межі включені.

/*Mthod 1:*/ var i = 78, j = 247, k = 170, a = , b = , c, d, e, f, l = 0; for(; i 20) ( bool = true; ) else ( bool = false; ) ) return number; )

Ось MS DotNet Впровадження класу Random у javascript -

Var Random = (function () ( function Random (Seed) ( if (!Seed) ( Seed = this.milliseconds(); ) this.SeedArray = ; for (var i = 0; i< 56; i++) this.SeedArray.push(0); var num = (Seed == -2147483648) ? 2147483647: Math.abs(Seed); var num2 = 161803398 - num; this.SeedArray = num2; var num3 = 1; for (var i_1 = 1; i_1 < 55; i_1++) { var num4 = 21 * i_1 % 55; this.SeedArray = num3; num3 = num2 - num3; if (num3 < 0) { num3 += 2147483647; } num2 = this.SeedArray; } for (var j = 1; j < 5; j++) { for (var k = 1; k < 56; k++) { this.SeedArray[k] -= this.SeedArray; if (this.SeedArray[k] < 0) { this.SeedArray[k] += 2147483647; } } } this.inext = 0; this.inextp = 21; Seed = 1; } Random.prototype.milliseconds = function () { var str = new Date().valueOf().toString(); return parseInt(str.substr(str.length - 6)); }; Random.prototype.InternalSample = function () { var num = this.inext; var num2 = this.inextp; if (++num >= 56) (num = 1;) if (++num2> = 56) (num2 = 1;) var num3 = this.SeedArray - this.SeedArray; if (num3 == 2147483647) ( num3--; ) if (num3< 0) { num3 += 2147483647; } this.SeedArray = num3; this.inext = num; this.inextp = num2; return num3; }; Random.prototype.Sample = function () { return this.InternalSample() * 4.6566128752457969E-10; }; Random.prototype.GetSampleForLargeRange = function () { var num = this.InternalSample(); var flag = this.InternalSample() % 2 == 0; if (flag) { num = -num; } var num2 = num; num2 += 2147483646.0; return num2 / 4294967293.0; }; Random.prototype.Next = function (minValue, maxValue) { if (!minValue && !maxValue) return this.InternalSample(); var num = maxValue - minValue; if (num = 0) { gen_num = parseInt((Math.random() * (max-min+1)) + min); } else { random_number.push(gen_num); is_exist = -2; } } while (is_exist >-1); ) document.getElementById("box").innerHTML = random_number; )

Щоб отримати випадкове число, скажімо, між 1 та 6, спочатку виконайте:

0.5 + (Math.random() * ((6 - 1) + 1))

Це множить випадкове число 6 і потім додає до нього 0.5. Потім округліть число до позитивного цілого числа, виконавши:

Math.round(0.5 + (Math.random() * ((6 - 1) + 1))

Це округляє число до цілого найближчого числа.

Або, щоб зробити це зрозумілішим, виконайте таке:

Var value = 0.5 + (Math.random() * ((6 - 1) + 1)) var roll = Math.round(value); return roll;

Загалом код для цього з використанням змінних:

Var value = (Min - 0.5) + (Math.random() * ((Max - Min) + 1)) var roll = Math.round(value); return roll;

Причиною відібрати 0,5 від мінімального значенняє те, що використання тільки мінімального значення дозволить вам отримати ціле число, яке було б більше за ваше максимального значення. Забравши 0,5 від мінімального значення, ви по суті запобігаєте округленню максимального значення.

Сподіваюся, що це допоможе.

Випадкове ціле число між найнижчим і найвищим:

Function randomRange(l,h)( var range = (h-l); var random = Math.floor(Math.random()*range); if (random === 0)(random+=1;) return l+random; )

Не саме елегантне рішення.. але щось швидке.

Тут я використовую для генерації випадкових чисел.

Function random(high,low) ( high++; return Math.floor((Math.random())*(high-low))+low; )

Ми виконуємо high++ тому, що Math.random() генерує випадкове число між 0, (включно) і 1 (виключення). Виключений означає, що ми повинні збільшувати максимум на один до виконання будь-якої математики. Потім ми віднімаємо низьке значення з максимуму, даючи нам найбільша кількістьдля генерації - низька, потім + низька, що призводить до повернення в нормальний стан і робить найменше число Крайній мірінизьким. то ми повертаємо результуюче число

random(7,3) може повернутися 3,4,5,6, або 7

/* Assuming, що window.crypto.getRandomValues ​​є наявним на реальному рівні, може бути з 0 до 1,998 до 0 до 2,000 Завантажити JavaScript для перегляду https://developer.mozilla.org/en-US/docs/Web/ RandomSource/getRandomValues ​​*/ var array = New Uint8Array(2); window.crypto.getRandomValues(array); console.log(array + array);

Uint8Array створює масив, заповнений числом до трьох цифр, що має бути трохи більше 999. Цей код дуже короткий.

Function getRandomInt(lower, upper) ( //to create an even sample distribution return Math.floor(lower + (Math.random() * (upper - lower + 1)))); //to produce an uneven sample distribution // return Math.round(lower + (Math.random() * (upper - lower)));//excl. upper - lower)));

Щоб перевірити цю функцію та варіанти цієї функції, збережіть нижче HTML/JavaScript у файл і відкрийте його у браузері. У коді буде показаний графік, що показує розподіл одного мільйона функцій. Код також буде записувати випадки країв, тому, якщо функція виробляє значення більше, ніж max, або менше, ніж min, you.will.know.about.it.

function getRandomInt(lower, upper) ( //to create an even sample distribution return Math.floor(lower + (Math.random() * (upper - lower + 1)))); //to produce an uneven sample distribution // return Math.round(lower + (Math.random() * (upper - lower)));//excl. upper - lower)));) var min = -5; var max = 5; var array = новий Array(); for(var i = 0; i 2012 function isEmpty(value)( return (typeof value === "undefined)" || value === null); } var numSeq = new Array(); function add(num,seq){ var toAdd = new Object(); toAdd.num = num; toAdd.seq = seq; numSeq = toAdd; } function fillNumSeq (num,seq){ var n; for(i=0;i 0.020000000000000004 0.3 - 0.1 > 0.19999999999999998 !}
Для практичних цілей ця неточність не має жодного значення, у нашому випадку ми говоримо про помилку в квінтильйонних частках, проте когось це може розчарувати. Ми можемо отримати трохи дивний результат і при роботі з числами, які є значеннями валют, відсотків або розмірів файлу. Для того, щоб виправити ці неточності, нам якраз і необхідно вміти округляти результати, достатньо встановити десяткову точність.

Округлення чисел має практичне застосування, ми можемо маніпулювати числом у певному діапазоні, наприклад, хочемо округлити значення до найближчого цілого числа, а не працювати лише з десятковою частиною.

Округлення десяткових чисел Для того, щоб відсікти десяткове число, використовуйте toFixed або метод toPrecision . Обидва вони приймають єдиний аргумент, який визначає, відповідно, скільки значущих цифр(тобто загальна кількість цифр, що використовуються в числі) або знаків після коми (кількість після десяткової точки) повинен включати результат:
  • Якщо аргумент не визначено для toFixed(), то за умовчанням він буде дорівнює нулю, що означає 0 знаків після коми, аргумент має максимальне значення, що дорівнює 20.
  • Якщо аргумент не заданий дляперегляду, число залишається незайманим
  • let 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"
    Обидва методи toFixed() і toPrecision() повертають рядкове представлення результату, а чи не число. Це означає, що при підсумовуванні округленого значення з randNum буде здійснено конкатенацію рядків, а не суму чисел:

    Let randNum = 6.25; let rounded = randNum.toFixed(); // "6" console.log(randNum + rounded); > "6.256"
    Якщо ви хочете, щоб результат мав числовий типданих, то вам необхідно буде застосувати parseFloat:

    Let randNum = 6.25; let rounded = parseFloat(randNum.toFixed(1)); console.log(rounded); > 6.3
    Зверніть увагу, що значення 5 округлені, за винятком поодиноких випадків.

    Методи toFixed() і toPrecision() є корисними, бо вони можуть не лише відсікати дробову частину, але й доповнювати знаки після коми, що зручно під час роботи з валютою:

    Let wholeNum = 1 let dollarsCents = wholeNum.toFixed(2); console.log(dollarsCents); > "1.00"
    Варто зауважити, що допереживання буде давати результат в експоненційному записі, якщо число цілих чисел більше, ніж сама сама точність:

    Let num = 123.435 num.toPrecision(2); > "1.2e+2"

    Як уникнути помилок округлення з десятковими числами.

    Let numTest = 1005; numTest.toFixed(2); > "1.00"
    Результат розрахунку повинен був бути 1.01, а не 1. Якщо ви хочете уникнути подібну помилку, ми можемо використовувати рішення, запропоноване Jack L Moore , яке використовує експоненційні числа для розрахунку:

    Function round(value, decimals) ( return Number(Math.round(value+"e"+decimals)+"e-"+decimals); )
    Тепер:

    Round (1.005,2); > 1.01
    Якщо ви хочете більш надійне рішення, ніж рішення наведене вище, ви можете перейти на MDN .

    Альтернативний метод округлення десяткових чисел був введений в ES6. Машинне епсілон округлення забезпечує розумну межу похибки при порівнянні двох чисел з плаваючою точкою. Без округлення, порівняння можуть дати результати, подібні до таких:

    0.1 + 0.2 === 0.3 > false
    Ми використовуємо Math.EPSILON у нашій функції для отримання коректного порівняння:

    Function epsEqu(x, y) ( return Math.abs(x - y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }
    Функція приймає два аргументи: перший – поточний розрахунок, другий – очікуваний результат. Вона повертає порівняння двох:

    EpsEqu(0.1 + 0.2, 0.3) > true
    Усі сучасні браузери вже підтримують ES6 математичні функціїале якщо ви хочете отримати підтримку в таких браузерах, як IE 11, використовуйте polyfills .

    Відсікання дробової частини Усі методи, наведені вище вміють округлювати до десяткових чисел. Для того, щоб просто відсікти число до двох знаків після коми, необхідно спочатку помножити його на 100, а потім отриманий результат уже розділити на 100:

    Function truncated(num) ( return Math.trunc(num * 100) / 100; ) truncated(3.1416) > 3.14
    Якщо ви хочете пристосувати метод під будь-яку кількість знаків після коми, ви можете скористатися подвійним побитовим запереченням:

    Function truncated(num, decimalPlaces) ( let numPowerConverter = Math.pow(10, decimalPlaces); return ~~(num * numPowerConverter)/numPowerConverter; )
    Тепер:

    Let randInt = 35.874993; truncated(randInt,3); > 35.874

    Округлення до найближчого числа Для того, щоб округлити десяткове число до найближчого числа у більшу або меншу сторону, залежно від того, до чого ми найближче, використовуйте Math.round():

    Math.round(4.3) > 4 Math.round(4.5) > 5
    Зверніть увагу, що «половина значення», 0.5 округляється в більший бікза правилами математики.

    Округлення до меншого до найближчого цілого числа Якщо ви хочете завжди округляти в меншу сторону, використовуйте Math.floor:

    Math.floor(42.23); > 42 Math.floor(36.93); > 36
    Зауважте, що округлення в меншу сторону працює для всіх чисел, у тому числі і для негативних. Уявіть хмарочос із нескінченною кількістю поверхів, у тому числі з поверхами нижнього рівня (що представляє негативні числа). Якщо ви знаходитесь в ліфті на нижнім рівнемміж 2 і 3 (що є значення -2.5), Math.floor доставить вас до -3:

    Math.floor(-2.5); > -3
    Але якщо ви хочете уникнути подібної ситуації, використовуйте Math.trunc, який підтримується у всіх сучасних браузерах(крім IE / Edge):

    Math.trunc(-41.43); > -41
    На MDN ви знайдете polyfill, який забезпечить підтримку Math.trunc у браузерах та IE/Edge.

    З іншого боку, якщо вам потрібно завжди округляти у більшу сторону, використовуйте Math.ceil. Знову ж таки, згадуємо нескінченний ліфт: Math.ceil завжди йтиме «вгору», незалежно від того, чи є число негативне чи ні:

    Math.ceil(42.23); > 43 Math.ceil(36.93); > 37 Math.ceil(-36.93); > -36

    Округлення до більшого/меншого необхідного числа Якщо ми хочемо, щоб округлити до найближчого числа, кратного 5, найпростіший спосіб створити функцію, яка ділить число на 5, заокруглює його, а потім множить його на ту ж суму:

    Function roundTo5(num) ( return Math.round(num/5)*5; )
    Тепер:

    RoundTo5(11); > 10
    Якщо ви хочете округляти до кратних свого значення, ми використовуємо більше загальну функцію, Передаючи в неї початкове значення і кратне:

    Function roundToMultiple(num, multiple) ( return Math.round(num/multiple)*multiple; )
    Тепер:

    Let initialNumber = 11; let multiple = 10; roundToMultiple(initialNumber, multiple); > 10;

    Фіксування числа в діапазоні Є багато випадків, коли хочемо отримати значення х, що лежить в межах діапазону. Наприклад, нам може знадобитися значення від 1 до 100, але при цьому ми отримали значення 123. Для того щоб виправити це, ми можемо використовувати мінімальне (повертає найменше з набору чисел) і максимальне (повертає найбільше з будь-якої множини чисел). У нашому прикладі діапазон від 1 до 100:

    Let lowBound = 1; let highBound = 100; let numInput = 123; let clamped = Math.max(lowBound, Math.min(numInput, highBound)); console.log(clamped); > 100;
    Знову ж таки, ми можемо перевикористовувати операцію і обернути все це в функцію, скористаємося рішенням, запропонованим Daniel X. Moore :

    Number.prototype.clamp = function(min, max) ( return Math.min(Math.max(this, min), max); );
    Тепер:

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

    Гауссове округлення Гауссове округлення, також відоме як банківське округлення, полягає в тому, що округлення для цього випадку відбувається до найближчого парного. Цей метод округлення працює без статистичної похибки. Краще рішеннябуло запропоновано Tim Down:

    Function gaussRound(num, decimalPlaces) ( let 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; }
    Тепер:

    GaussRound(2.5) > 2 gaussRound(3.5) > 4 gaussRound(2.57,1) > 2.6
    Десятковий знак у CSS:

    Так як JavaScript часто використовується для створення позиційного перетворення HTML-елементів, ви можете поставити питання, що станеться, якщо ми cгенеруємо десяткові значення для наших елементів:

    #box (width: 63.667731993px; )
    Хороша новина полягає в тому, що сучасні браузери враховуватимуть десяткові значення у блочній моделі, у тому числі у процентних чи піксельних одиницях виміру.

    Сортування Дуже часто нам доводиться сортувати будь-які елементи, наприклад, у нас є масив ігрових рекордів, при цьому вони повинні бути організовані за зменшенням рангу гравців. На жаль, стандартний метод sort() має деякі дивовижні обмеження: він добре працює з англійськими словами, що часто вживаються, але відразу ж ламається при зустрічі з числами, унікальними символами або словами в верхньому регістрі. Сортування в алфавітному порядкуЗдавалося б, сортування масиву за алфавітом має бути найпростішим завданням:

    Let fruit = ["butternut squash", "apricot", "cantaloupe"]; fruit.sort(); > "apricot", "butternut squash", "cantaloupe"]
    Тим не менш, ми стикаємося з проблемою, як тільки один з елементів знаходиться у верхньому регістрі:

    Let fruit = ["butternut squash", "apricot", "Cantalope"]; fruit.sort(); > "Cantaloupe", "apricot", "butternut squash"]
    Це пов'язано з тим, що, за замовчуванням, сортувальник порівнює перший символ, представлений в Unicode . Unicode - це унікальний код будь-якого символу, незалежно від платформи, незалежно від програми, незалежно від мови. Наприклад, якщо по кодовій таблиці символ «a» має значення U+0061 (в шістнадцятковій системі 0x61), у той час як символ C має код U+0043 (0x43), який йде раніше в Unicode-таблиці, ніж символ a.

    Щоб відсортувати масив, який може містити змішані регістри перших літер, нам необхідно або перетворити всі елементи тимчасово нижній регістр, або визначити свій порядок сортування за допомогою localeCompare() методу з деякими аргументами. Як правило, для такого випадку, краще відразу створити функцію для багаторазового використання:

    Function alphaSort(arr) ( arr.sort(function (a, b) ( return a.localeCompare(b, "en", ("sensitivity": "base")); )); ) let fruit = ["butternut squash "Apricot", "Cantaloupe"]; alphaSort(fruit) >
    Якщо ви хочете отримати масив відсортований у зворотному алфавітному порядку, просто поміняйте позиціями а та b у функції:

    Function alphaSort(arr) ( arr.sort(function (a, b) ( return b.localeCompare(a, "en", ("sensitivity": "base")); )); ) let fruit = ["butternut squash "Apricot", "Cantaloupe"]; alphaSort(fruit) > ["Cantaloupe", "butternut squash", "apricot"]
    Тут варто звернути увагу, що localeCompare використовується з аргументами, ще треба пам'ятати, що він підтримується IE11+, для більш старих версій IE ми можемо використовувати його без аргументів, і в нижньому регістрі:

    Function caseSort(arr) ( arr.sort(function (a, b) ( return a.toLowerCase().localeCompare(b.toLowerCase()); )); ) let fruit = ["butternut squash", "apricot", "Cantaloupe"]; caseSort(fruit) > ["apricot", "butternut squash", "Cantaloupe"]

    Числове сортування Все це не відноситься до того прикладу, про який ми говорили вище про масив ігрових рекордів. З деякими числовими масивамисортування працює просто ідеально, але в якийсь момент результат може бути непередбачуваним:

    Let highScores = ; highScores.sort(); >
    Справа в тому, що метод sort() здійснює лексикографічне порівняння: а це означає, що числа будуть перетворені в рядок і порівняння будуть знову проводитися шляхом зіставлення першого символу цього рядка в порядку символів Unicode-таблиці. Тому нам знову необхідно визначити свій порядок сортування:

    Let highScores = ; highScores.sort(function(a,b) ( return a - b; )); >
    Знову ж таки, для сортування чисел у зворотному порядку, поміняйте позиціями a та b у функції.

    Сортування JSON-подібної структури І нарешті, якщо у нас є JSON-подібна структура даних, представлена ​​як масив ігрових рекордів:

    Let scores = [ ( "name": "Daniel", "score": 21768 ), ( "name": "Michael", "score": 33579 ), ( "name": "Alison", "score": 38395 )];
    В ES6+, ви можете використовувати стрілочні функції:

    Scores.sort((a, b) => b.score - a.score));
    Для старих браузерів, які не мають такої підтримки:

    Scores.sort(function(a, b) (return a.score - b.score));
    Як бачите, сортування JavaScript це досить не очевидна річ, я сподіваюся, що ці приклади полегшать як-небудь життя.

    Робота зі статечними функціями Зведення в ступінь - операція, що визначається як результат багаторазового множення натурального числа на себе, квадратний корінь з числа a - число, що дає a при зведенні в квадрат. Цими функціями ми могли користуватися постійно в повсякденному життіпід час уроків математики, зокрема під час обчислення площ, обсягів і навіть при фізичному моделюванні.

    JavaScript статечна функція представлена ​​як Math.pow(), в новому стандарті ES7 був представлений новий операторзведення у ступінь - "* *".

    Зведення в ступінь Для того, щоб звести число в n-ий ступінь, використовуйте функцію Math.pow(), де перший аргумент це число, яке буде зведено в ступінь, другий аргумент це показник ступеня:

    Math.pow(3,2) > 9
    Така форма запису означає 3 у квадраті, або 3 × 3, що призводить до результату 9. Можна навести ще приклад, звичайно:

    Math.pow (5,3); > 125
    Тобто, 5 у кубі, або 5×5×5, дорівнює 125.

    ECMAScript 7 – це наступна версія JavaScript, в принципі, ми можемо використовувати новий запропонований оператор зведення в ступінь - * *, така форма запису може бути наочнішою:

    3 ** 2 > 9
    на Наразіпідтримка цього оператора досить обмежена, тому його не рекомендується використовувати.

    Ступенева функція може стати в нагоді в різних ситуаціях. Простий приклад, обчислення кількості секунд за годину: Math.pow (60,2).

    Квадратний та кубічний корінь Math.sqrt() та Math.cbrt() протилежні функції Math.pow(). Як пам'ятаємо, квадратний корінь у складі a - число, дає a під час зведення квадрат.

    Math.sqrt(9) > 3
    У той же час кубічний корінь із числа a - число, що дає a при зведенні куб.

    Math.cbrt(125) > 5
    Math.cbrt() був введений у специфікацію JavaScript зовсім недавно, і тому підтримується лише у сучасних браузерах: Chrome 38+, Firefox та Opera 25+ та Safari 7.1+. Ви помітите, що Internet Explorerвідсутній у цьому списку, однак на MDN ви знайдете поліфіл.

    Приклади Звичайно, ми можемо використовувати не цілі значення в одній з цих функцій:

    Math.pow (1.25, 2); > 1.5625 Math.cbrt(56.57) > 3.8387991760286138
    Зверніть увагу, що це цілком працює і при використанні негативних значеннях аргументів:

    Math.pow(-5,2) > 25 Math.pow(10,-2) > 0.01
    Тим не менш, для квадратного кореня це не працюватиме:

    Math.sqrt(-9) > NaN
    З математичного аналізуми знаємо, що під уявним числом розуміють квадратне коріння з негативних чисел. І це може призвести нас до ще однієї техніки роботи з комплексними числамиале це вже інша історія.

    Ви можете використовувати дробові значення в Math.pow(), щоб знайти квадратні та кубічні коренічисел. Квадратний коріньвикористовує показник 0.5:

    Math.pow (5, 0.5); // = Math.sqrt(5) = 5 ** (1/2) > 2.23606797749979
    Однак, через капризи з плаваючою точкою, ви не можете точно припустити правильний результат:

    Math.pow(2.23606797749979,2) > 5.000000000000001
    У таких ситуаціях, вам доведеться вдаватися до відсікання знаків у числа або округлення до будь-якого значення.

    Деякі з незрозумілих причин у JavaScript плутають функцію Math.pow() з Math.exp() , яка є експоненційною функцією для чисел, загалом. Примітка: англійською"показник ступеня" перекладається як "exponent", тому це швидше відноситься до англомовних, хоча існують і альтернативні назви показника ступеня, такі як index, power.

    Математичні константи Робота з математикою JavaScript полегшується за рахунок низки вбудованих констант. Ці константи є властивостями об'єкта Math. Варто звернути увагу на те, що константи пишуться у верхньому регістрі, а не CamelCase нотації.

    Тільки зареєстровані користувачі можуть брати участь в опитуванні. , будь ласка.

    Теги: Додати теги Дуже часто обчислення JavaScript дають не зовсім ті результати, які ми хочемо. Зрозуміло, ми можемо робити з числами будь-що - округлювати у більшу чи меншу сторону, встановлювати діапазони, відсікати непотрібні числа до певної кількості знаків після коми, все залежить від того, що ви хочете зробити надалі з цим числом. Навіщо потрібне округлення? Одним із цікавих аспектів JavaScript є те, що він насправді не зберігає цілі числа, ми відразу ж працюємо з числами з плаваючою точкою. Це, у поєднанні з тим фактом, що багато дробових значень не можуть бути виражені кінцевим числом знаків після коми, в JavaScript ми можемо отримати такі результати:

    0.1 * 0.2; > 0.020000000000000004 0.3 - 0.1 > 0.19999999999999998
    Для практичних цілей ця неточність не має жодного значення, у нашому випадку ми говоримо про помилку в квінтильйонних частках, проте когось це може розчарувати. Ми можемо отримати трохи дивний результат і при роботі з числами, які є значеннями валют, відсотків або розмірів файлу. Для того, щоб виправити ці неточності, нам якраз і необхідно вміти округляти результати, достатньо встановити десяткову точність.

    Округлення чисел має практичне застосування, ми можемо маніпулювати числом у певному діапазоні, наприклад, хочемо округлити значення до найближчого цілого числа, а не працювати лише з десятковою частиною.

    Округлення десяткових чисел Для того, щоб відсікти десяткове число, використовуйте toFixed або метод toPrecision . Обидва вони приймають єдиний аргумент, який визначає, відповідно, скільки значущих цифр (тобто загальна кількість цифр, що використовуються в числі) або знаків після коми (кількість після десяткової точки) повинен включати результат:
  • Якщо аргумент не визначений для toFixed(), то за умовчанням він дорівнюватиме нулю, що означає 0 знаків після коми, аргумент має максимальне значення, що дорівнює 20.
  • Якщо аргумент не заданий дляперегляду, число залишається незайманим
  • let 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"
    Обидва методи toFixed() і toPrecision() повертають рядкове представлення результату, а чи не число. Це означає, що при підсумовуванні округленого значення з randNum буде здійснено конкатенацію рядків, а не суму чисел:

    Let randNum = 6.25; let rounded = randNum.toFixed(); // "6" console.log(randNum + rounded); > "6.256"
    Якщо ви хочете, щоб результат мав числовий тип даних, вам необхідно буде застосувати parseFloat:

    Let randNum = 6.25; let rounded = parseFloat(randNum.toFixed(1)); console.log(rounded); > 6.3
    Зверніть увагу, що значення 5 округлені, за винятком поодиноких випадків.

    Методи toFixed() і toPrecision() є корисними, бо вони можуть не тільки відсікати дробову частину, а й доповнювати знаки після коми, що зручно під час роботи з валютою:

    Let wholeNum = 1 let dollarsCents = wholeNum.toFixed(2); console.log(dollarsCents); > "1.00"
    Варто зауважити, що допереживання буде давати результат в експоненційному записі, якщо число цілих чисел більше, ніж сама сама точність:

    Let num = 123.435 num.toPrecision(2); > "1.2e+2"

    Як уникнути помилок округлення з десятковими числами.

    Let numTest = 1005; numTest.toFixed(2); > "1.00"
    Результат розрахунку повинен був бути 1.01, а не 1. Якщо ви хочете уникнути подібну помилку, ми можемо використовувати рішення, запропоноване Jack L Moore , яке використовує експоненційні числа для розрахунку:

    Function round(value, decimals) ( return Number(Math.round(value+"e"+decimals)+"e-"+decimals); )
    Тепер:

    Round (1.005,2); > 1.01
    Якщо ви хочете більш надійне рішення, ніж рішення наведене вище, ви можете перейти на MDN .

    Альтернативний метод округлення десяткових чисел був введений в ES6. Машинне епсілон округлення забезпечує розумну межу похибки при порівнянні двох чисел з плаваючою точкою. Без округлення, порівняння можуть дати результати, подібні до таких:

    0.1 + 0.2 === 0.3 > false
    Ми використовуємо Math.EPSILON у нашій функції для отримання коректного порівняння:

    Function epsEqu(x, y) ( return Math.abs(x - y)< Number.EPSILON * Math.max(Math.abs(x), Math.abs(y)); }
    Функція приймає два аргументи: перший – поточний розрахунок, другий – очікуваний результат. Вона повертає порівняння двох:

    EpsEqu(0.1 + 0.2, 0.3) > true
    Всі сучасні браузери вже підтримують ES6 математичних функцій, але якщо ви хочете отримати підтримку в таких браузерах, як IE 11, використовуйте polyfills .

    Відсікання дробової частини Усі методи, наведені вище вміють округлювати до десяткових чисел. Для того, щоб просто відсікти число до двох знаків після коми, необхідно спочатку помножити його на 100, а потім отриманий результат уже розділити на 100:

    Function truncated(num) ( return Math.trunc(num * 100) / 100; ) truncated(3.1416) > 3.14
    Якщо ви хочете пристосувати метод під будь-яку кількість знаків після коми, ви можете скористатися подвійним побитовим запереченням:

    Function truncated(num, decimalPlaces) ( let numPowerConverter = Math.pow(10, decimalPlaces); return ~~(num * numPowerConverter)/numPowerConverter; )
    Тепер:

    Let randInt = 35.874993; truncated(randInt,3); > 35.874

    Округлення до найближчого числа Для того, щоб округлити десяткове число до найближчого числа у більшу або меншу сторону, залежно від того, до чого ми найближче, використовуйте Math.round():

    Math.round(4.3) > 4 Math.round(4.5) > 5
    Зверніть увагу, що «половина значення», 0.5 округляється у велику сторону за правилами математики.

    Округлення до меншого до найближчого цілого числа Якщо ви хочете завжди округляти в меншу сторону, використовуйте Math.floor:

    Math.floor(42.23); > 42 Math.floor(36.93); > 36
    Зауважте, що округлення в меншу сторону працює для всіх чисел, у тому числі і для негативних. Уявіть хмарочос із нескінченною кількістю поверхів, у тому числі з поверхами нижнього рівня (що представляє негативні числа). Якщо ви знаходитесь в ліфті на нижньому рівні між 2 і 3 (що являє собою значення -2.5), Math.floor доставить вас до -3:

    Math.floor(-2.5); > -3
    Але якщо ви хочете уникнути подібної ситуації, використовуйте Math.trunc, який підтримується у всіх сучасних браузерах (крім IE/Edge):

    Math.trunc(-41.43); > -41
    На MDN ви знайдете polyfill, який забезпечить підтримку Math.trunc у браузерах та IE/Edge.

    З іншого боку, якщо вам потрібно завжди округляти у більшу сторону, використовуйте Math.ceil. Знову ж таки, згадуємо нескінченний ліфт: Math.ceil завжди йтиме «вгору», незалежно від того, чи є число негативне чи ні:

    Math.ceil(42.23); > 43 Math.ceil(36.93); > 37 Math.ceil(-36.93); > -36

    Округлення до більшого/меншого необхідного числа Якщо ми хочемо, щоб округлити до найближчого числа, кратного 5, найпростіший спосіб створити функцію, яка ділить число на 5, заокруглює його, а потім множить його на ту ж суму:

    Function roundTo5(num) ( return Math.round(num/5)*5; )
    Тепер:

    RoundTo5(11); > 10
    Якщо ви хочете округляти до кратних свого значення, ми використовуємо більш загальну функцію, передаючи в неї початкове значення і кратне:

    Function roundToMultiple(num, multiple) ( return Math.round(num/multiple)*multiple; )
    Тепер:

    Let initialNumber = 11; let multiple = 10; roundToMultiple(initialNumber, multiple); > 10;

    Фіксування числа в діапазоні Є багато випадків, коли хочемо отримати значення х, що лежить в межах діапазону. Наприклад, нам може знадобитися значення від 1 до 100, але при цьому ми отримали значення 123. Для того щоб виправити це, ми можемо використовувати мінімальне (повертає найменше з набору чисел) і максимальне (повертає найбільше з будь-якої множини чисел). У нашому прикладі діапазон від 1 до 100:

    Let lowBound = 1; let highBound = 100; let numInput = 123; let clamped = Math.max(lowBound, Math.min(numInput, highBound)); console.log(clamped); > 100;
    Знову ж таки, ми можемо перевикористовувати операцію і обернути все це в функцію, скористаємося рішенням, запропонованим Daniel X. Moore :

    Number.prototype.clamp = function(min, max) ( return Math.min(Math.max(this, min), max); );
    Тепер:

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

    Гауссове округлення Гауссове округлення, також відоме як банківське округлення, полягає в тому, що округлення для цього випадку відбувається до найближчого парного. Цей метод округлення працює без статистичної похибки. Найкраще рішення було запропоновано Tim Down:

    Function gaussRound(num, decimalPlaces) ( let 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; }
    Тепер:

    GaussRound(2.5) > 2 gaussRound(3.5) > 4 gaussRound(2.57,1) > 2.6
    Десятковий знак у CSS:

    Так як JavaScript часто використовується для створення позиційного перетворення HTML-елементів, ви можете поставити питання, що станеться, якщо ми cгенеруємо десяткові значення для наших елементів:

    #box (width: 63.667731993px; )
    Хороша новина полягає в тому, що сучасні браузери враховуватимуть десяткові значення у блочній моделі, у тому числі у процентних чи піксельних одиницях виміру.

    Сортування Дуже часто нам доводиться сортувати будь-які елементи, наприклад, у нас є масив ігрових рекордів, при цьому вони повинні бути організовані за зменшенням рангу гравців. На жаль, стандартний метод sort() має деякі дивовижні обмеження: він добре працює з англійськими словами, що часто вживаються, але відразу ж ламається при зустрічі з числами, унікальними символами або словами у верхньому регістрі. Сортування в алфавітному порядку Здавалося б, сортування масиву за алфавітом має бути найпростішим завданням:

    Let fruit = ["butternut squash", "apricot", "cantaloupe"]; fruit.sort(); > "apricot", "butternut squash", "cantaloupe"]
    Тим не менш, ми стикаємося з проблемою, як тільки один з елементів знаходиться у верхньому регістрі:

    Let fruit = ["butternut squash", "apricot", "Cantalope"]; fruit.sort(); > "Cantaloupe", "apricot", "butternut squash"]
    Це пов'язано з тим, що, за замовчуванням, сортувальник порівнює перший символ, представлений в Unicode . Unicode - це унікальний код будь-якого символу, незалежно від платформи, незалежно від програми, незалежно від мови. Наприклад, якщо по кодовій таблиці символ «a» має значення U+0061 (у шістнадцятковій системі 0x61), тоді як символ «C» має код U+0043 (0x43), який йде раніше в Unicode-таблиці, ніж символ "a".

    Щоб відсортувати масив, який може містити змішані регістри перших букв, нам необхідно або перетворити всі елементи тимчасово в нижній регістр, або визначити порядок сортування за допомогою методу localeCompare() з деякими аргументами. Як правило, для такого випадку, краще відразу створити функцію для багаторазового використання:

    Function alphaSort(arr) ( arr.sort(function (a, b) ( return a.localeCompare(b, "en", ("sensitivity": "base")); )); ) let fruit = ["butternut squash "Apricot", "Cantaloupe"]; alphaSort(fruit) >
    Якщо ви хочете отримати масив відсортований у зворотному алфавітному порядку, просто поміняйте позиціями а та b у функції:

    Function alphaSort(arr) ( arr.sort(function (a, b) ( return b.localeCompare(a, "en", ("sensitivity": "base")); )); ) let fruit = ["butternut squash "Apricot", "Cantaloupe"]; alphaSort(fruit) > ["Cantaloupe", "butternut squash", "apricot"]
    Тут варто звернути увагу, що localeCompare використовується з аргументами, ще треба пам'ятати, що він підтримується IE11+, для більш старих версій IE ми можемо використовувати його без аргументів, і в нижньому регістрі:

    Function caseSort(arr) ( arr.sort(function (a, b) ( return a.toLowerCase().localeCompare(b.toLowerCase()); )); ) let fruit = ["butternut squash", "apricot", "Cantaloupe"]; caseSort(fruit) > ["apricot", "butternut squash", "Cantaloupe"]

    Числове сортування Все це не відноситься до того прикладу, про який ми говорили вище про масив ігрових рекордів. З деякими числовими масивами сортування працює просто ідеально, але в якийсь момент результат може бути непередбачуваним:

    Let highScores = ; highScores.sort(); >
    Справа в тому, що метод sort() здійснює лексикографічне порівняння: а це означає, що числа будуть перетворені в рядок і порівняння будуть знову проводитися шляхом зіставлення першого символу цього рядка в порядку символів Unicode-таблиці. Тому нам знову необхідно визначити свій порядок сортування:

    Let highScores = ; highScores.sort(function(a,b) ( return a - b; )); >
    Знову ж таки, для сортування чисел у зворотному порядку, поміняйте позиціями a та b у функції.

    Сортування JSON-подібної структури І нарешті, якщо у нас є JSON-подібна структура даних, представлена ​​як масив ігрових рекордів:

    Let scores = [ ( "name": "Daniel", "score": 21768 ), ( "name": "Michael", "score": 33579 ), ( "name": "Alison", "score": 38395 )];
    В ES6+, ви можете використовувати стрілочні функції:

    Scores.sort((a, b) => b.score - a.score));
    Для старих браузерів, які не мають такої підтримки:

    Scores.sort(function(a, b) (return a.score - b.score));
    Як бачите, сортування JavaScript це досить не очевидна річ, я сподіваюся, що ці приклади полегшать як-небудь життя.

    Робота зі статечними функціями Зведення в ступінь - операція, що визначається як результат багаторазового множення натурального числа на себе, квадратний корінь з числа a - число, що дає a при зведенні в квадрат. Цими функціями ми могли користуватися постійно у повсякденному житті під час уроків математики, зокрема під час обчислення площ, обсягів і навіть при фізичному моделюванні.

    У JavaScript статечна функція представлена ​​як Math.pow(), в новому стандарті ES7 був представлений новий оператор зведення в ступінь - "* *".

    Зведення в ступінь Для того, щоб звести число в n-ий ступінь, використовуйте функцію Math.pow(), де перший аргумент це число, яке буде зведено в ступінь, другий аргумент це показник ступеня:

    Math.pow(3,2) > 9
    Така форма запису означає 3 у квадраті, або 3 × 3, що призводить до результату 9. Можна навести ще приклад, звичайно:

    Math.pow (5,3); > 125
    Тобто, 5 у кубі, або 5×5×5, дорівнює 125.

    ECMAScript 7 - це наступна версія JavaScript, в принципі, ми можемо використовувати новий запропонований оператор зведення в ступінь - * *, така форма запису може бути наочнішою:

    3 ** 2 > 9
    На даний момент підтримка цього оператора досить обмежена, тому його не рекомендується використовувати.

    Ступенева функція може стати в нагоді в різних ситуаціях. Простий приклад, обчислення кількості секунд за годину: Math.pow (60,2).

    Квадратний та кубічний корінь Math.sqrt() та Math.cbrt() протилежні функції Math.pow(). Як пам'ятаємо, квадратний корінь у складі a - число, дає a під час зведення квадрат.

    Math.sqrt(9) > 3
    У той же час кубічний корінь із числа a - число, що дає a при зведенні куб.

    Math.cbrt(125) > 5
    Math.cbrt() був введений у специфікацію JavaScript зовсім недавно, і тому підтримується лише у сучасних браузерах: Chrome 38+, Firefox та Opera 25+ та Safari 7.1+. Ви помітите, що Internet Explorer відсутня у цьому списку, однак на MDN ви знайдете поліфіл.

    Приклади Звичайно, ми можемо використовувати не цілі значення в одній з цих функцій:

    Math.pow (1.25, 2); > 1.5625 Math.cbrt(56.57) > 3.8387991760286138
    Зверніть увагу, що це цілком працює і при використанні негативних значеннях аргументів:

    Math.pow(-5,2) > 25 Math.pow(10,-2) > 0.01
    Тим не менш, для квадратного кореня це не працюватиме:

    Math.sqrt(-9) > NaN
    З математичного аналізу ми знаємо, що під уявним числом розуміють квадратне коріння з негативних чисел. І це може призвести до ще однієї техніки роботи з комплексними числами, але це вже інша історія.

    Ви можете використовувати дробові значення в Math.pow(), щоб знайти квадратні та кубічні корені чисел. Квадратний корінь використовує показник 0.5:

    Math.pow (5, 0.5); // = Math.sqrt(5) = 5 ** (1/2) > 2.23606797749979
    Однак, через капризи з плаваючою точкою, ви не можете точно припустити правильний результат:

    Math.pow(2.23606797749979,2) > 5.000000000000001
    У таких ситуаціях, вам доведеться вдаватися до відсікання знаків у числа або округлення до будь-якого значення.

    Деякі з незрозумілих причин у JavaScript плутають функцію Math.pow() з Math.exp() , яка є експоненційною функцією для чисел, загалом. Примітка: в англійській мові «показник ступеня» перекладається як «exponent», тому це скоріше стосується англомовних, хоча існують і альтернативні назви показника ступеня, такі як index, power.

    Математичні константи Робота з математикою JavaScript полегшується за рахунок низки вбудованих констант. Ці константи є властивостями об'єкта Math. Варто звернути увагу на те, що константи пишуться у верхньому регістрі, а не CamelCase нотації.

    Тільки зареєстровані користувачі можуть брати участь в опитуванні. Заходьте будь ласка.

    Теги:
    • javascript
    • математика
    Додати теги

    Технічно термін «генератор випадкових чисел» – це абсурд, оскільки числа власними силами є випадковими. Наприклад, 100 це випадкове число? А 25? Що насправді означає цей термін, то це те, що створюється послідовність чисел, що з'являються випадковим чином. Це породжує складніше питання: що таке послідовність випадкових чисел? Єдино правильна відповідь: послідовність випадкових чисел – це послідовність, де всі елементи є непов'язаними. Це визначення призводить до такого феномена, що будь-яка послідовність може бути як випадковою, і невипадковою залежно від цього, як ця послідовність отримана. Наприклад, наступний рядокчисел
    1 2 3 4 5 6 7 8 9 0
    була отримана друкуванням верхнього рядкаклавіатури по порядку, таким чином, послідовність не може розглядатися як згенерована випадковим чином. Але як бути, якщо ви отримаєте ту ж саму послідовність, виймаючи пронумеровані тенісні кулі з барила. У даному випадкуце вже випадково згенерована послідовність. Цей прикладпоказує, що випадковість послідовності залежить від цього, як було отримано, а чи не від неї самої.

    Пам'ятайте, що послідовність чисел, згенерована комп'ютером, детермінована: кожне число, крім першого, залежить від попередніх чисел. Технічно це означає, що комп'ютер може бути згенерована тільки квазівипадкова послідовність чисел, тобто. насправді вони не є випадковими. Однак, цього достатньо більшості завдань і такі послідовності для простоти будуть називатися випадковими. Один дуже цікавий метод був розроблений Джоном фон Нейманом; його часто називають середньоквадратичним. У цьому методі попереднє випадкове число зводиться у квадрат, та був з результату виділяються середні цифри. Наприклад, якщо ви створюєте числа із трьох цифр, а попереднє число було 121, то зведення у квадрат дає результат 14641. Виділення трьох середніх цифр дає наступне випадкове число 464. Недоліком даного методу є те, що він має дуже короткий період повторення, званий циклом . З цієї причини даний методсьогодні не використовується. Сучасні методигенерації випадкових чисел значно складніше.

    Випадкові числа в PHP

    У PHP є дві групи функцій роботи з випадковими числами. Суто зовні їх можна відрізнити за префіксом mt_ у всіх функцій однієї з груп.

    Застарілі функції
    Функція rand. Повертає ціле число від нуля до значення RAND_MAX (яке 32767). Може мати два необов'язкові цілі параметри - якщо вони вказані, то генерується випадкове число від першого параметра до другого.

    Echo rand(); echo rand(1,100); // Видаємо випадкове число від 1 до 100

    Функція srand. Задає послідовність випадкових чисел, що видається функцією rand. Має цілий параметр - при різних значенняхцього параметра rand видаватиме різні послідовності чисел. Функцію srand достатньо викликати лише один раз перед усіма викликами функції rand. Приклад використання:

    Srand (1288); // Ініціалізація генератора випадкових чисел for($i=0; $i