Заметим, что числа в яваскрипт хранятся в формате с плавающей точкой 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;
}
добавил в копилку))
ВНИМАНИЕ ! Будь осторожен. Некоторые броузеры на Андроид не генерят случайное. С момента старта javascript функция random выдает строго ОДНУ И ТУ ЖЕ последовательность случайных чисел. При повторном запуске снова та же посл-сть
А почему нельзя сделать так?
Или есть подвох?
Ну, так у тебя будет диапазон от 0 до 1000. А если ты возьмёшь пример из сайта, то сам указываешь диапазон.
Ой блин!
Я Math.random(); перепутал с пхпшным rand();
))
function getRandomArbitary(min, max)
{return Math.random() * (max - min) + min;}
А зачем "* (max - min)"?
Math.random() возвращает дробное число от 0 до 1.
0 ≤ Math.random() < 1
Поэтому нужно получить случайное число от 0 до разницы между максимумом и минимумом (решается умножением этой разницы на случайное число) и добавить минимум.
Math.floor(Math.random() * (max - min + 1)) + min;
В результате будет число min, т.к. умножение на 0 идет
C чего бы это?
конечно всё однозначно помогло вот только подскажите как это рандомное значение присвоить переменной?
а вот кстате и еще 1 подвох смотрите т к функция присваивает дробное значение то после такой функции результаты частенько придется округлять
Воистину
По моему, выражение по поиску случайного целого между min и max Math.floor(Math.random() * (max - min + 1)) + min; даст дробный результат, если min будет дробным.
И еще, не учитывается, что может быть 2 дробных числа, между которыми не существует целого, например 1,5 и 1,7.
Ну вы еще про то, что max может оказаться меньше чем min скажите
Зачем такие "Сложности"?Когда можно так:
ты хоть сам проверь вначале свой код)
как альтернатива:
Math.floor(Math.random()*196) + 5 // от 5 до 200
// случайное число без повторов!
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;
}
Молодец! Только после таких махинаций случайное число перестает быть СЛУЧАЙНЫМ.
Слушай а можно ли так чтоб только 2 цифры повторялись например : 112345 или156139 и. Т.д
а нельзя
Math.Random(0,56); - случайное число от 0 до 56.
А как задать чтобы ряд чисел был по порядку от 0 до 56 ?
Через цикл вывести
примерно так :
procedure cir (min,max :integer) begin
var: i: integer
i:= min
while i<=max do
begin
write(i," ");
i:=i+1;
end;
cir(0,56);
P.S. Написал на языке pascal потому, что не помню как будет на js
у меня второй и третий пример выдают всегда одно и тоже число
min = 0,
max = 1,
Math.random(), берем редкий случай, равно 1,
Тогда Math.floor(1 * (1 - 0 + 1)) + 0 даст результат равный 2, в то время, когда должны были получить 1.
Уж лучше тогда
По крайней мере современные браузеры это не позволяют.
Нет, вы забыли что Math.random() возвращает дробное число от 0 до 1.
0 ≤ Math.random() < 1
Собственно, если нет необходимости в минимальном и максимальном порогах числа ... можно пофантазировать на тему "длины" числа, а именно :
Что можно развернуть, во что-то такое :
randomByLength(1,3) - вернет число от 1 до 999
randomByLength(3,5) - вернет число от 999 до 99999
Собственно допиливать можно много чего, но как альтернатива - достойное жизни решение
Мля, зачем столько тупых ненужных операций работы со строками, когда быстрее и оптимальнее будет getRandomInt(100, 99999) -- вот тебе и число от 3 до 5 цифр. И да, у тебя тупая опечатка - трехзначное число начинается не от 999, а от 100.
Интересно, а почему работу метода Math реализовали именно подобным образом, а не сделали изначально так, чтобы он возвращал случайное число из переданного ему диапазона?
Потому что встроенная функция для работы с диапазоном была бы точно такой же, какой ее может написать любой программист.
В описание было бы очень здорово добавить то, что функция возвращает число от 0 до 1, в справочник ведь именно это и идут узнать.
А как это работает?
меня двойная тильда смущает
~~ Приводит число к целому
~ Приводит число к целому отрицательному
А вообще, если не понимаешь как работает какая-то штука в JS, в хроме нажимаешь F12, заходишь во вкладку Console и пишешь там код на JS
мне нужно сделать в html так чтобы решались квадратные уравнения при условии:a*x в квадрате+b*x+c=0
1)D=0 -> 1 корень
2)D>0 -> 2 корня
3)D<0 -> не имеет решений
Кол-во корней (?)
D
x1
x2
Дескрименант и иксы должны быть определеными коофициэнтами
мм*, разумеется.
function getRandomArbitary(min, max)
{
return Math.random() * (max - min) + min;
}
здесь ноль может генерировать или от одного?
Не могу подобрать код, чтобы нажимая на картинку переходить случайно на одну из 20 страниц.
А так не проще:
вернет целое число в диапазоне (min, max)
Сорри, за предыдущий код, вот правильный
parseInt()?? Серьезно?? Функция для парсинга строк, там где их нет? Да уж, у тебя извращенное предствление о понятии "так проще".
Никак не могу найти однозначного ответа для моей задачи. Нужна помощь разбирающихся в данной теме.
Есть код:
var tmp= Math.round((Math.random() * 99 + 1)); // покажет число из от 1 до 100
Что необходимо сделать, чтобы исключить при показе следующие диапазоны цифр:
от 1 до 4, от 22 до 24, от 32 до 34
Заранее благодарю за помощь!
1. НЕ НУЖНО использовать round() при работе с рандомными числами!
2. Диапазон от min до max делается правильно так, как уже давно за тебя сделали в этой статье.
3. "чтобы исключить при показе". Так исключи при ПОКАЗЕ. Как только присвоилось число из данного диапазона - вызови функцию random повторно, такой механизм лучше всего сделать в цикле. С твоим диапазоном зацикливание не светит. Ладно, вот код:
Выдаст случайное число 1 или 0
А как получить посредством Math.random() случайный id html элементов? Вроде min и max тут не совсем те категории?
наверное надо сначала сохранить в массиве id->значение а потом рандомно выбирать.я js только начал изучать поэтому незнаю можно ли с помощтю DOM такое проделывать
Здравствуйте у меня вопрос по третьему примеру зачем "+1"?
Может ли Math.random() = 1;?
Вдруг переменные сложатся так:
Math.floor(Math.random(1) * (10 - 5 + 1)) + 5;
Math.floor(Math.random() * (max - min + 1)) + min;
Рассмотрим подробно как работает наш пример и почему используется именно такая форма записи. Первым делом нам надо указать минимальное получаемое значение из нужного диапазона, в нашем примере это число 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.
Но Math.floor изменяет до большего или меньшего целого, тогда почему в Вашем примере она от 100.9 возвращает 100, а не 101 ?
Объясните мне пожалуйста математику.
Почему мы рандомное число от 0 до 0.999... умножаем на разницу +1 и потом еще прибавляем минимальное значение?
Если с разницей я вроде что-то понял - мы же число должны получить рандомное из заданного диапазона, поэтому и указан диапазон,кроме того минимальное значение вполне возможно, что не ноль.
Если кому интересно увидеть, что будет при разных округлениях. Вот скрипт.
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));
min будет генерироваться чуть чаще, т.к. генерироваться будет [min ; max). Почему так?
Наконец-то про floor вспомнили..
VasyaDs kj[b dct ,kzlm t,fyst yf[eq
А теперь переведите это на клаве с английского на руский!
неплохо
но можно и лучше
Очень понравился материал, но можно и подробнее, очень помогает при разработке. Спасибо!
мамин хацкер ты куда xss то пишешь?
Добрый день, может кто подскажет...Не работает Math.random не переходит в курсив. Причем вводишь Mat идет курсив. Стоит только ввести h - курсив сразу пропадает. В чем может быть причина?