Курс JS: js.itgid.info Курс вестки: html.itgid.info Интернет магазин на Node: node.itgid.info Плейлист: goo.gl/63osiv Телеграм: t.me/jsrules Мои курсы: itgid.info Делаем статистику массива и изучаем Math.random в JavaScript
Ошибка в том, что Math.round пользуется, т.е. число от 0 до 1 округляется то к 0 то к 1. Нужно всегда вместе с Math.round использовать только Math.floor, тогда все от 0 до 1 упадет в 0, от 1 до 2 в 2 и т.д., и выборка будет от 0 до 9, т.е. ровно 10 значений. Короче говоря в этом видео есть огромная логическая ошибка и оно, по факту, ниочем.
Согласен. Но кроме этого меня ещё смущает постоянное использование "грязных функций". Поддержка проекта даже среднего размера, где ни одна функция не является "чистой", - это просто адище. Такой код невозможно покрыть юнит-тестами, крайне трудно отлаживать, расширять и рефакторить. Это действительно ужас и боль. 😰
Random умножать на 10.99, вместо Round использовать Floor. Round отсекает у 0 и 10 половину поля значений, поэтому и получается их частота вдвое ниже остальных.
напишите это в консоли, внимание на результат. let data = Array(10).fill(0) for (let i = 0; i < 999999; i ++) { rand = Math.floor(Math.random() * 10) data[rand]++ } data Всё дело в Math.round. Более того. всё работает правильно и так, как и задумано. Это не проблема random или round
Об"ясню подробнее, что бы все поняли.... Каким образом у нас получаются цифры от 1 - 9? Округление. К примеру выпадают числа: 0.5 - будет 1. 1.4999 - будет 1. Вполне нормальный диапазон [0.5, 1.5). Ноль получается всё так же, округление. 0.4999..... - будет 0. А всё выше - будет 1. Итого диапазон для нуля у нас [0, 0.5) Для 10 это работает так же Вот и об"яснение "сломанного рандома"
Да уж, прикинь, об этом этот чувак ещё и ролик загрузил, и говорит, что Math.random некорректен. Действительно, если бы человек знал как работает Math.floor, то смог бы понять, что по статистике Math.random работает корректно и выдаёт "хорошее" равномерное распределение от 0 до 1. Тупо тер вер надо учить.
В діапазоні від 0 до 10 включно потрібно так Math.floor((10*Math.random())+1); Юзабельніть Round в іншому (на відео все видно), а от Math.ceil((11*Math.random())-1) більш природно показує результат на графіках.
Более того, псевдорандомность math.random заключается ещё и в том, что одинаковые числа часто выпадают подряд друг за другом. Например 7, 7, 8, 8, 8, 6, 6 и т.д, что происходит из-за округления дробной части.
Если округлить 8.59 будет 9, если округлить 9.42 будет 9. А если округлить 9.60 будет 10, но а 10.25 (например) мы округилть не можем, потому что такого числа у нас не может быть. У 0 и 10 шанс в 2 раза меньше. Поэтому нам надо Math.random() умножать на 11 и отнимать 0.5, и тогда наше случайное число будет от -0.5 до 10.5, и тогда 10 и 0 будут выпадать с одинаковой частотой как и другие числа.
Самый простой способ - делать тоже самое, только для округления использовать Math.floor вместо Math.round. В таком случае будут равномерно сгенерированны числа от минимального (включительно) до максимального (не включительно)
Здравствуйте, Александр, нигде не могу найти, как зарегистрироваться на вашем сайте ддя прохождения бесплатного курса. Нашел только, как залогиниться, но не зарегистрироваться. Или же курс рассчитан на тех, кто уже купил хоть 1?
Если знать математику и тервер ничего удивительного в работе рандомных генераторов в ЯП нет. Они работают, как и должны работать. Но многие даже не подозревают, что нельзя их использовать, к примеру, для выбора победителя в розыгрышах.
Self - это по сути название переменной, которой присваивается this. Место self может быть любое название переменной , с присваиванием переменной связанно использование основного контекста внутри вложенной функции. Если нужны примеры, могу объяснить на пальцах
ребята помогите решить пожалуйста На вход подается фраза на русском языке, содержащая числительное. Например, "Я хочу квартиру за 10.5 миллионов" или "Мне нравится когда моя машина, стоимостью сотку штук баксов, мелькает по телевизору". Необходимо выделить числительное в форме натурального числа и вернуть.
А что тут писать, всего-то указать соответствие для всех возможных слов, обозначающих числа, во всех возможных формах, типа "миллион" && "миллионов"&& "миллиона" && "лимон" && "лимонов" && "лимона" && "лям" && "лямов" && "ляма" && "мульт" && "мульта" && "мультов", ставишь в соответствие к умножению на 1,000,000 и перебираешь строки, аналогично со словами вроде "сотку" или "штук", само собой не забудь поставить проверки контекста, ведь "штук" может означать 1, а может и 1000, да и не каждый лимон должен стать миллионом, помни об этом)) И да прибудет с тобой терпение)
Задачи по массивами обычно решаю круглосуточно.. Если мне какая-то задачка попадется, то я даже уснуть не могу - она у меня в голове крутится и крутится. Пока в голове решение не созреет, не могу заснуть :(
Спасибо огромное за урок. Но: момент настройки графика, сорвал последовательность восприятия самой сути урока, я тут же потерял фокус восприятия, и перефокусировался на настройки графика- и получился урок: физики+ рисования, вроде и связь есть, но всё о разном))) Успехов Вам!!!
Друзья, подскажите пожалуйста логику этого цикла: for (var i = 0; i < a.length; i++) { if (stat[a[i]]) { stat[a[i]]++; } else { stat[a[i]] = 1; }; }; Никак не могу понять: получается, у нас 100 итераций. Первый проход берёт первое число из массива (допустим, число 5) и подставляет его в условие: if (stat[5]) { stat[5]++;} ... Видимо я туповат, не могу понять, что проверяет if? Как это выражение (if (stat[a[i]]) ) можно написать более развернуто? Типа if (stat[a[i]] == a[i]) ... тогда было бы понятнее, а так не могу понять что с чем сравнивает, ведь изначально в объекте stat = {} у нас вообще ничего нет.
Если вкратце, то браузер пытается опустить код в if () до примитива true или false. Если в if () передана пустая строка - false. Если длина строки >= 1 - true. Тоже самое приключается и с цифрами. 0 - false, все остальные - true. А вот теперь ваш случай. Когда мы создаём объект и обращаемся к не присвоеному имени, брауер возвращает undifined. Undifined в if () опускается до false, любое другое число (Кроме 0) к true. В вашем примере происходит простая проверка, на не равенство к undifined (Или как говорят, на проверка на существование). Тоесть это можно расписать как if (typeof stat[a[i]] !== 'undefined')
@@someonesomeone8668 Если код проверяет только на существование значения - тогда как получается так, что результатом этого цикла получается отсортированный список одинаковых чисел? В любом случае, спасибо за ответ, буду тоже думать...
Изначально "stat" пустой, а сгенерированные числа из массива "a" мы используем как индексы для "stat", при первой встрече каждого индекса в него записывается единица (через "else"), при каждой следующей встрече значение увеличивается на 1, "if" просто проверяет на существование, можно было сразу обнулить все значения до "10" и без проверки делать stat++, но было бы не так интересно) а более развернуто "if" можно написать как if(stat == true) { stat++ } else { stat = 1 }, прикольная штука. В "if" вообще все что хочешь можно закинуть, и значения вроде "0" "null" "NaN" "false" "undefined" или пустая строка "" он воспримет как ложь и выполнится "else", все остальные значения, включая дробные и отрицательные числа воспримет как истину и выполнит свой блок, поэтому пока stat пустой он считается ложью, а когда в него закинули единицу он стал истиной) P.S. видел, что ответ уже есть, но хотел дать свой ответ, может кому-то понятнее покажется)
Это можно доказать математически. х є [0; 1) / [0.000; 0.999]. Если умножить такое число на 3 => [0.000; 2.997]. Также важен факт, что Math.round() округляет 0.500 => 1/ 1.499 => 1. И применив комбинаторику и теорию вероятности => всего вариантов 2000, подходящих для первого - 500, для 2 - 1000, для 3 - 500, то есть Р(1) = 0.25, Р(2) = 0.5, Р(3) = 0.25. То есть шанс чтобы выпало 2 такой-же, как и 1 или 2. Можно добавить, что первое + последнее === любому другому. Лучше пользоваться Math.floor(Math.random() * ( n +1)) //n = 3 //1, 2, 3