Почему если есть необходимость найти случайное число из диапазона рекомендуют использовать именно функцию
var rand = min - 0.5 + Math.random() * (max - min + 1)
Откуда это взято, почему так ?
*я тоже читал learn.javascript.ru но не могу понять, почему берут это значение
JavaScript
Почему именно эта формула взята для random числа из диапазона ?
Т. к. Math.random() возвращает значение из диапазона [0;1) (т. е. значения 1.0 никогда не будет), то математически правильный вариант генерации целочисленного случайного значения из диапазона [min;max] выглядит так:
rand = min + Math.floor(Math.random() * (max - min + 1))
Для случайного вещественного числа из диапазона [min;max) правильно будет:
rand = min + Math.random() * (max - min)
rand = min + Math.floor(Math.random() * (max - min + 1))
Для случайного вещественного числа из диапазона [min;max) правильно будет:
rand = min + Math.random() * (max - min)
Максим Кушаков
Это конечно всё классно, но понимания не добавило. Да вот этот пример learn.javascript.ru/task/random-int-min-max но почему именно так, откуда ?
Ну допустим нужно целое число между 80 и 120...
Math.random() = выдает что-то между 0 включительно и 1 не включительно.
Умножаем его на 40,
Math.random()*40 = получится число между 0 и 40
Добавим 80... получится число между (0 + 80) и ( 40 + 80 ) = между 80 - 120.
Но число еще не целое...
Math.floor( Math.random()*40 + 80 )
это дело округляет любое число до НИЖНЕГО целого числа... т. е. 41.9 сделает 41.
Вот и получаются числа от 80 включительно до 119 (не включая 120). Надо было бы получать и 120, сделали бы плюс 81 вместо 80.
а это страшное Math.random()*(max - min) + min ...
ни что иное, как Math.random()*(120-80) + 80 = Math.random()*40 + 80 ...
max - min просто определяет диапазон возможных чисел. Который изначально в этом примере и так интуитивно был понятен, что 40.
____________
Переписывая ваш абстрактный пример на те же числа от 80 до 120...
В примере — Math.round( min - 0.5 + Math.random() * (max - min + 1) )
Math.round( 80 - 0.5 + Math.random() * (120 - 80 + 1) )
Math.round( 79.5 + Math.random() * (41) )
Возвращается число от (79.5 + 0) до (79.5 + 40.99999...) и округляется...
Фишка в том, что Math.round() из 1.5 сделает 2, а из 1.49999 уже сделает 1.
Поэтому в данном случае выдаст:
от 80 (меньше 79.5 точно не будет) до 120 (максимум 120.49999)
С тем же успехом можно было записать так:
Math.round( min + Math.random() * (max - min + 0.5) )
Math.random() = выдает что-то между 0 включительно и 1 не включительно.
Умножаем его на 40,
Math.random()*40 = получится число между 0 и 40
Добавим 80... получится число между (0 + 80) и ( 40 + 80 ) = между 80 - 120.
Но число еще не целое...
Math.floor( Math.random()*40 + 80 )
это дело округляет любое число до НИЖНЕГО целого числа... т. е. 41.9 сделает 41.
Вот и получаются числа от 80 включительно до 119 (не включая 120). Надо было бы получать и 120, сделали бы плюс 81 вместо 80.
а это страшное Math.random()*(max - min) + min ...
ни что иное, как Math.random()*(120-80) + 80 = Math.random()*40 + 80 ...
max - min просто определяет диапазон возможных чисел. Который изначально в этом примере и так интуитивно был понятен, что 40.
____________
Переписывая ваш абстрактный пример на те же числа от 80 до 120...
В примере — Math.round( min - 0.5 + Math.random() * (max - min + 1) )
Math.round( 80 - 0.5 + Math.random() * (120 - 80 + 1) )
Math.round( 79.5 + Math.random() * (41) )
Возвращается число от (79.5 + 0) до (79.5 + 40.99999...) и округляется...
Фишка в том, что Math.round() из 1.5 сделает 2, а из 1.49999 уже сделает 1.
Поэтому в данном случае выдаст:
от 80 (меньше 79.5 точно не будет) до 120 (максимум 120.49999)
С тем же успехом можно было записать так:
Math.round( min + Math.random() * (max - min + 0.5) )
Чарымурад Ханов
во ерундой занимаетесь - объясняете бесплатно школьникам
Добавлю немного к ответу "Elepsis Eclipse". Такие формулы получаются "составные", каждая часть которой решает свою маленькую задачу.
Немного своими словами, может понятней будет:
Math.random()*40 - Из ответа "Elepsis Eclipse" результат работы такого выражения будет рандомное число от 0 и до 40. Предположим нам нужно что бы рандомное число начиналось с 80. Значит мы к результату работы выражения прибавляем 80. Диапазон от 0 и до 40 и прибавить 80 получим диапазон сместится на 80. (0, 40)+80 = (0+80, 40+80). То есть диапазон уже будет от 80 и до 120. А что если нам нужно до 110 и нас не устраивает 120. Тогда нужно изменить первоначальный диапазон. Math.random()*30 в таком случае рандомное число будет колебаться от 0 и до 30 и при прибавлении 80 мы сместим колебания рандомного числа на 80 единиц. От 80 и до 110. А как же получить число на которое нужно умножить что бы получить диапазон до определенного значения!? Да легко: у нас должно колебаться от какого то начального значения (в нашем случае 80) до какого-то конечного значения (пусть будет 120) то есть "размах" с которым должно колебаться рандомное значение составляет 120 - 80 = 40. Вот поэтому и используют такую формулу. А если вы со старта уже знаете готовые значения, то смело пишите это значение и не нужно отнимать. Все остальное в ответе "Elepsis Eclipse".
Сама формула, а в частности составные части формулы и за что отвечают:
min - 0.5 + Math.random() * (max - min + 1)
Math.random() - дает рандомное число от нуля и до единицы не включительно
max - min - таким образом вычисляется каков будет диапазон колебаний рандомного числа
Math.random() * (max - min) - колебания рандомного числа будут в пределе от нуля и до (max-min) не включительно
+1 - нужно что бы диапазон включал последнее число иначе будет до, но не включительно
min-0.5 + -тут 0.5 используется что бы диапазон цеплял нижнее значение включительно, так же как и единица для верхнего диапазона.
А (min - 0.5) прибавляется для того, что бы нижний диапазон начинался с min
Немного своими словами, может понятней будет:
Math.random()*40 - Из ответа "Elepsis Eclipse" результат работы такого выражения будет рандомное число от 0 и до 40. Предположим нам нужно что бы рандомное число начиналось с 80. Значит мы к результату работы выражения прибавляем 80. Диапазон от 0 и до 40 и прибавить 80 получим диапазон сместится на 80. (0, 40)+80 = (0+80, 40+80). То есть диапазон уже будет от 80 и до 120. А что если нам нужно до 110 и нас не устраивает 120. Тогда нужно изменить первоначальный диапазон. Math.random()*30 в таком случае рандомное число будет колебаться от 0 и до 30 и при прибавлении 80 мы сместим колебания рандомного числа на 80 единиц. От 80 и до 110. А как же получить число на которое нужно умножить что бы получить диапазон до определенного значения!? Да легко: у нас должно колебаться от какого то начального значения (в нашем случае 80) до какого-то конечного значения (пусть будет 120) то есть "размах" с которым должно колебаться рандомное значение составляет 120 - 80 = 40. Вот поэтому и используют такую формулу. А если вы со старта уже знаете готовые значения, то смело пишите это значение и не нужно отнимать. Все остальное в ответе "Elepsis Eclipse".
Сама формула, а в частности составные части формулы и за что отвечают:
min - 0.5 + Math.random() * (max - min + 1)
Math.random() - дает рандомное число от нуля и до единицы не включительно
max - min - таким образом вычисляется каков будет диапазон колебаний рандомного числа
Math.random() * (max - min) - колебания рандомного числа будут в пределе от нуля и до (max-min) не включительно
+1 - нужно что бы диапазон включал последнее число иначе будет до, но не включительно
min-0.5 + -тут 0.5 используется что бы диапазон цеплял нижнее значение включительно, так же как и единица для верхнего диапазона.
А (min - 0.5) прибавляется для того, что бы нижний диапазон начинался с min
Похожие вопросы
- Заполнение массива случайными простыми числами в диапазоне от 2 до n
- Объясните формулы по этому коду. Почему именно так?
- вопрос про JS, рандом чисел в %
- Факториал числа JS
- Как вычислять простые числа?
- Если в массиве меньше 2-х чисел, вернуть строку, сообщающую, что чисел недостаточно.
- Найти положительное число n
- JavaScript Как сделать решение математических задач с несколькими числами?
- Javascript как сделать так, чтобы два рандомных числа в одном цикле не повтрялись
- Подскажите регулярное выражение. В каждом случае нужно выбрать стоимость или диапазон стоимости и время