Заметим, что числа в яваскрипт хранятся в формате с плавающей точкой IEEE 754 с округлением в сторону ближайшего четного. Поэтому иногда, в очень редких случаях, возможна генерация обычно исключенной верхней границы.
Пример: Cлучайное число от 0(включительно) до 1
function getRandom()
{
return Math.random();
}
Пример: Случайное число между min и max
function getRandomArbitary(min, max)
{
return Math.random() * (max - min) + min;
}
Пример: Случайное целое между min и max
// использование Math.round() даст неравномерное распределение!
function getRandomInt(min, max)
{
return Math.floor(Math.random() * (max - min + 1)) + min;
}
Автор: Александ (не зарегистрирован), дата: 18 ноября, 2009 - 17:46
#permalinkдобавил в копилку))
Автор: vital (не зарегистрирован), дата: 17 декабря, 2009 - 15:11
#permalinkА почему нельзя сделать так?
Или есть подвох?
Автор: vital (не зарегистрирован), дата: 17 декабря, 2009 - 15:20
#permalinkОй блин!
Я Math.random(); перепутал с пхпшным rand();
))
Автор: Гость (не зарегистрирован), дата: 30 марта, 2010 - 16:44
#permalinkfunction getRandomArbitary(min, max)
{return Math.random() * (max - min) + min;}
А зачем "* (max - min)"?
Автор: Гость (не зарегистрирован), дата: 1 января, 2011 - 14:16
#permalinkMath.floor(Math.random() * (max - min + 1)) + min;
В результате будет число min, т.к. умножение на 0 идет
Автор: Гость (не зарегистрирован), дата: 8 января, 2011 - 15:53
#permalinkконечно всё однозначно помогло вот только подскажите как это рандомное значение присвоить переменной?
Автор: Гость (не зарегистрирован), дата: 15 января, 2011 - 15:22
#permalinkа вот кстате и еще 1 подвох смотрите т к функция присваивает дробное значение то после такой функции результаты частенько придется округлять
Автор: lymish, дата: 8 марта, 2011 - 10:38
#permalinkПо моему, выражение по поиску случайного целого между min и max Math.floor(Math.random() * (max - min + 1)) + min; даст дробный результат, если min будет дробным.
Автор: lymish, дата: 8 марта, 2011 - 10:51
#permalinkИ еще, не учитывается, что может быть 2 дробных числа, между которыми не существует целого, например 1,5 и 1,7.
Автор: Гуля1 (не зарегистрирован), дата: 11 июня, 2011 - 23:48
#permalinkfunction getRandomArbitary(min, max) { return Math.random() * (max - min) + min; }// использование Math.round() даст неравномерное распределение! function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }Зачем такие "Сложности"?Когда можно так:
function getRandomArbitary (max) { return Math.random() * max; }function getRandomArbitary (max) { return Math.random() * (max +1); }// использование Math.round() даст неравномерное распределение! function getRandomInt(min, max) { return Math.floor(Math.random() * max)+min; }function getRandomInt { return Math.floor(Math.random() * 6)+6;//11 }Автор: kuzroman, дата: 14 сентября, 2011 - 18:14
#permalinkкак альтернатива:
Math.floor(Math.random()*196) + 5 // от 5 до 200
Автор: kuzroman, дата: 14 сентября, 2011 - 18:14
#permalink// случайное число без повторов!
var randNum;
var randNumOld;
function getRandomInt(min, max)
{
randNum = Math.floor(Math.random() * (max - min + 1)) + min;
if(randNum==randNumOld) getRandomInt(1, kolFoto);
randNumOld = randNum;
return randNum;
}
Автор: Гость (не зарегистрирован), дата: 17 января, 2012 - 22:21
#permalinkа нельзя
function random(max){math.floor(math.random() * max);}Автор: Гость (не зарегистрирован), дата: 11 сентября, 2012 - 15:55
#permalinkу меня второй и третий пример выдают всегда одно и тоже число
Автор: Гость (не зарегистрирован), дата: 14 ноября, 2012 - 22:03
#permalinkmin = 0,
max = 1,
Math.random(), берем редкий случай, равно 1,
Тогда Math.floor(1 * (1 - 0 + 1)) + 0 даст результат равный 2, в то время, когда должны были получить 1.
Уж лучше тогда
Автор: stevenp (не зарегистрирован), дата: 5 декабря, 2012 - 15:48
#permalinkНет, вы забыли что Math.random() возвращает дробное число от 0 до 1.
0 ≤ Math.random() < 1
Автор: OP3, дата: 25 июня, 2013 - 16:52
#permalinkСобственно, если нет необходимости в минимальном и максимальном порогах числа ... можно пофантазировать на тему "длины" числа, а именно :
Что можно развернуть, во что-то такое :
function randomByLength(min,max){ var a=0;while(!a||a.toString().length<min) a=parseInt(Math.random().toString().substr(2,max)); return a; } alert(randomByLength(1,3));randomByLength(1,3) - вернет число от 1 до 999
randomByLength(3,5) - вернет число от 999 до 99999
Собственно допиливать можно много чего, но как альтернатива - достойное жизни решение
Автор: SP7, дата: 24 октября, 2013 - 22:02
#permalinkИнтересно, а почему работу метода Math реализовали именно подобным образом, а не сделали изначально так, чтобы он возвращал случайное число из переданного ему диапазона?
Автор: Гость (не зарегистрирован), дата: 6 декабря, 2013 - 01:35
#permalinkВ описание было бы очень здорово добавить то, что функция возвращает число от 0 до 1, в справочник ведь именно это и идут узнать.
Автор: Гость (не зарегистрирован), дата: 7 декабря, 2013 - 11:29
#permalinkА как это работает?
меня двойная тильда смущает
Автор: Гость (не зарегистрирован), дата: 2 июля, 2014 - 22:44
#permalinkмне нужно сделать в html так чтобы решались квадратные уравнения при условии:a*x в квадрате+b*x+c=0
1)D=0 -> 1 корень
2)D>0 -> 2 корня
3)D<0 -> не имеет решений
Кол-во корней (?)
D
x1
x2
Дескрименант и иксы должны быть определеными коофициэнтами
Автор: FANTOM22A, дата: 20 октября, 2014 - 22:28
#permalinkfunction getRandomArbitary(min, max)
{
return Math.random() * (max - min) + min;
}
здесь ноль может генерировать или от одного?
Автор: Илья Владимирович (не зарегистрирован), дата: 6 ноября, 2014 - 11:44
#permalinkНе могу подобрать код, чтобы нажимая на картинку переходить случайно на одну из 20 страниц.
Автор: Андрей Изман (не зарегистрирован), дата: 6 декабря, 2014 - 03:42
#permalinkА так не проще:
вернет целое число в диапазоне (min, max)
Автор: Андрей Изман (не зарегистрирован), дата: 6 декабря, 2014 - 03:51
#permalinkСорри, за предыдущий код, вот правильный
function random(min, max) { return parseInt(Math.random() * (max - min + 1)+ min); }Автор: Гость (не зарегистрирован), дата: 8 декабря, 2014 - 19:28
#permalinkНикак не могу найти однозначного ответа для моей задачи. Нужна помощь разбирающихся в данной теме.
Есть код:
var tmp= Math.round((Math.random() * 99 + 1)); // покажет число из от 1 до 100
Что необходимо сделать, чтобы исключить при показе следующие диапазоны цифр:
от 1 до 4, от 22 до 24, от 32 до 34
Заранее благодарю за помощь!
Автор: Ergamon (не зарегистрирован), дата: 20 января, 2015 - 03:41
#permalinkВыдаст случайное число 1 или 0
Автор: Гость (не зарегистрирован), дата: 27 февраля, 2015 - 13:02
#permalinkА как получить посредством Math.random() случайный id html элементов? Вроде min и max тут не совсем те категории?
Автор: konabis777 (не зарегистрирован), дата: 16 июня, 2015 - 02:25
#permalinkЗдравствуйте у меня вопрос по третьему примеру зачем "+1"?
Может ли Math.random() = 1;?
Вдруг переменные сложатся так:
Math.floor(Math.random(1) * (10 - 5 + 1)) + 5;
Math.floor(Math.random() * (max - min + 1)) + min;
Автор: Гость (не зарегистрирован), дата: 16 августа, 2015 - 10:40
#permalinkРассмотрим подробно как работает наш пример и почему используется именно такая форма записи. Первым делом нам надо указать минимальное получаемое значение из нужного диапазона, в нашем примере это число 50. Теперь нам нужно каким-то образом получить случайное число, которое при сложении с числом 50 не будет превышать в сумме число 100. Как мы знаем из математики, нахождение неизвестного слагаемого делается путём вычитания из суммы известного слагаемого. 100 - 50: получаем разность 50. Теперь для проверки, подходит нам это число или нет, умножим его на возможное минимальное и максимальное число возвращаемое методом Math.random(). Умножаем минимальное 0.004704564176082244 * 50 = 0.2... и максимальное 0.9999999999746223 * 50 = 49.9... И так мы видим, что при умножении разности на максимально возможное случайное число в результате даёт нам целую часть числа на единицу меньше, чем нужно. Чтобы исправить ситуацию, нам нужно всего лишь прибавить одну единицу к 50, т.е. 50 + 1 = 51, теперь если полученное число умножить на максимально возможно число возвращаемое методом у нас будет выходить число 50.9... - это то, что нам надо, после сложения чисел 50.9 + 50, получаем 100.9. Для округления числа до целого используем метод Math.floor(). Таким образом, формула для получения нужного числа выглядит следующим образом: max - min + 1.
Автор: Гость (не зарегистрирован), дата: 30 ноября, 2015 - 02:35
#permalinkfunction getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }Объясните мне пожалуйста математику.
Почему мы рандомное число от 0 до 0.999... умножаем на разницу +1 и потом еще прибавляем минимальное значение?
Если с разницей я вроде что-то понял - мы же число должны получить рандомное из заданного диапазона, поэтому и указан диапазон,кроме того минимальное значение вполне возможно, что не ноль.
Автор: Гость (не зарегистрирован), дата: 17 марта, 2016 - 21:22
#permalinkЕсли кому интересно увидеть, что будет при разных округлениях. Вот скрипт.
function getRandomIntFloor(min, max){
return Math.floor(Math.random()*(max-min+1))+min;
}
function getRandomIntCeil(min, max){
return Math.ceil(Math.random()*(max-min+1))+min;
}
function getRandomIntRound(min, max){
return Math.round(Math.random()*(max-min+1))+min;
}
var arr1 = [];
var arr2 = [];
var arr3 = [];
for (var i = 0; i < 100000; i++){
arr1.push(getRandomIntFloor(0,100));//Math.floor - округляет вниз (3.1 = 3)
arr2.push(getRandomIntCeil(0,100));//Math.ceil - округляет вверх (3.1 =4)
arr3.push(getRandomIntRound(0,100));//Math.round - округляет до ближайшего целого
}
function getArr(arr) {
var n1 = 0;//счетчик нулевых значений
var n2 = 0;//счетчик значений равных 100
var n3 = 0;//счетчик значений равных 101
for (var i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
n1++;
} else if (arr[i] == 100) {
n2++;
} else if (arr[i] == 101) {
n3++;
}
}
return 'Количество нулей = ' + n1 + '. Количество 100 = ' + n2 + '. Количество 101 = ' + n3 + '.';
}
alert('Применение Math.floor: ' + getArr(arr1));
alert('Применение Math.ceil: ' + getArr(arr2));
alert('Применение Math.round: ' + getArr(arr3));
Автор: Гость (не зарегистрирован), дата: 23 июня, 2016 - 20:00
#permalinkmin будет генерироваться чуть чаще, т.к. генерироваться будет [min ; max). Почему так?
Автор: aha (не зарегистрирован), дата: 19 августа, 2016 - 17:46
#permalinkНаконец-то про floor вспомнили..
Автор: Im boss (не зарегистрирован), дата: 19 октября, 2017 - 16:18
#permalinkVasyaDs kj[b dct ,kzlm t,fyst yf[eq
А теперь переведите это на клаве с английского на руский!
Автор: Гость (не зарегистрирован), дата: 12 июня, 2018 - 20:47
#permalinkнеплохо
Автор: Гость, дата: 12 июня, 2018 - 20:47
#permalinkно можно и лучше
Автор: Разработчик (не зарегистрирован), дата: 12 июня, 2018 - 20:54
#permalinkОчень понравился материал, но можно и подробнее, очень помогает при разработке. Спасибо!
Автор: Гость (не зарегистрирован), дата: 5 октября, 2019 - 19:14
#permalinkмамин хацкер ты куда xss то пишешь?
Автор: krisburger (не зарегистрирован), дата: 27 сентября, 2020 - 12:53
#permalinkДобрый день, может кто подскажет...Не работает Math.random не переходит в курсив. Причем вводишь Mat идет курсив. Стоит только ввести h - курсив сразу пропадает. В чем может быть причина?