17 ответов:
Если бы вы хотели получить между 1 и 6, Вы бы вычисляли:
Math.floor(Math.random() * 6) + 1Где:
- 1-начальное число
- 6 - это число возможных результатов (1 + Старт (6) - конец (1))
function randomIntFromInterval(min,max) // min and max included { return Math.floor(Math.random()*(max-min+1)+min); }Что он делает "дополнительно", так это позволяет случайные интервалы, которые не начинаются с 1. Таким образом, вы можете получить случайное число от 10 до 15, например. Гибкость.
Математика.случайный()
Из документации по Сети разработчика Mozilla:
// Returns a random integer between min (include) and max (include) Math.floor(Math.random() * (max - min + 1)) + min;Полезные примеры:
// 0 -> 10 Math.floor(Math.random() * 11); // 1 -> 10 Math.floor(Math.random() * 10) + 1; // 5 -> 20 Math.floor(Math.random() * 16) + 5; // -10 -> (-2) Math.floor(Math.random() * 9) - 10;
TL; DR
function generateRandomInteger(min, max) { return Math.floor(min + Math.random()*(max + 1 - min)) }Чтобы получить случайное число
generateRandomInteger(-20, 20);ПОЯСНЕНИЕ НИЖЕ
Нам нужно получить случайное целое число, скажем X между min и max.Верно?
То есть min
Если вычесть min из уравнения, то это эквивалентно
0
Теперь умножим это на случайное число r который
0
Теперь добавим обратно min к уравнению
Min
Теперь давайте выберем функцию, которая приводит к r такой,что она удовлетворяет нашему диапазону уравнений как [min, max]. Это возможно только в том случае, если 0Хорошо. Теперь диапазон r , то есть [0,1], очень похож на математику.результат функции random (). Не это?
Математика.функция random() возвращает псевдослучайную функцию с плавающей запятой число в диапазоне [0, 1); то есть от 0 (включительно) до но не включая 1 (эксклюзив)
Например,
Случай r = 0
min+ 0 * (max-min) = минСлучай r = 1
min+ 1 * (max-min) = maxСлучайный случай с использованием математики.случайный 0
max
min+ r * (max-min) = X, где X имеет диапазон мин XПриведенный выше результатX является случайным числом. Однако из-за математики.random () наша левая граница является инклюзивной,а правая-эксклюзивной. Чтобы включить нашу правую границу, мы увеличиваем правую границу на 1 и уменьшаем результат.
function generateRandomInteger(min, max) { return Math.floor(min + Math.random()*(max + 1 - min)) }Чтобы получить случайное число
generateRandomInteger(-20, 20);
Или в подчеркивание
_.random(min, max)
Jsfiddle: https://jsfiddle.net/cyGwf/477/
Случайное целое число : чтобы получить случайное целое число между
minиmax, используйте следующий кодfunction getRandomInteger(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min)) + min; }Случайное число с плавающей запятой : чтобы получить случайное число с плавающей запятой между
minиmax, используйте следующий кодfunction getRandomFloat(min, max) { return Math.random() * (max - min) + min; }Ссылка: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
Математика не является моей сильной стороной, но я работал над проектом, в котором мне нужно было генерировать множество случайных чисел между положительными и отрицательными.
function randomBetween(min, max) { if (min < 0) { return min + Math.random() * (Math.abs(min)+max); }else { return min + Math.random() * max; } }Например
randomBetween(-10,15)//or.. randomBetween(10,20)//or... randomBetween(-200,-100)Конечно, вы также можете добавить некоторую проверку, чтобы убедиться, что вы не делаете этого ни с чем, кроме чисел. Также убедитесь, что min всегда меньше или равно max.
Я написал более гибкую функцию, которая может дать вам случайное число, но не только целое.
function rand(min,max,interval) { if (typeof(interval)==='undefined') interval = 1; var r = Math.floor(Math.random()*(max-min+interval)/interval); return r*interval+min; } var a = rand(0,10); //can be 0, 1, 2 (...) 9, 10 var b = rand(4,6,0.1); //can be 4.0, 4.1, 4.2 (...) 5.9, 6.0Исправлена версия.
Я искал генератор случайных чисел, написанный в TypeScript, и я написал это после прочтения всех ответов, надеюсь, что он будет работать для кодеров TypeScript.
Rand(min: number, max: number): number { return (Math.random() * (max - min + 1) | 0) + min; }
Несмотря на множество ответов и почти тот же результат. Я хотел бы добавить свой ответ и объяснить его работу. Потому что важно понимать его работу, а не копировать вставляя одну строку кода. Генерация случайных чисел - это не что иное, как простая математика.
Код:
function getR(lower, upper) { var percent = (Math.random() * 100); // this will return number between 0-99 because Math.random returns decimal number from 0-0.9929292 something like that //now you have a percentage, use it find out the number between your INTERVAL :upper-lower var num = ((percent * (upper - lower) / 100)); //num will now have a number that falls in your INTERVAL simple maths num += lower; //add lower to make it fall in your INTERVAL //but num is still in decimal //use Math.floor>downward to its nearest integer you won't get upper value ever //use Math.ceil>upward to its nearest integer upper value is possible //Math.round>to its nearest integer 2.4>2 2.5>3 both lower and upper value possible console.log(Math.floor(num), Math.ceil(num), Math.round(num)); }
Смысл вам нужно добавить 1 к максимальному числу, а затем вычесть минимальное число для любого из этого, чтобы работать, и мне нужно сделать много случайных целых чисел, эта функция работает.
Это работает как с отрицательными, так и с положительными числами, и я работаю над десятичными числами для библиотеки.var random = function(max, min) { high++; return Math.floor((Math.random()) * (max - min)) + min; };
Вместо
Math.random()можно использоватьcrypto.getRandomValues()для генерации равномерно распределенных криптографически защищенных случайных чисел. Вот пример:
function randInt(min, max) { var MAX_UINT32 = 0xFFFFFFFF; var range = max - min; if (!(range <= MAX_UINT32)) { throw new Error( "Range of " + range + " covering " + min + " to " + max + " is > " + MAX_UINT32 + "."); } else if (min === max) { return min; } else if (!(max > min)) { throw new Error("max (" + max + ") must be >= min (" + min + ")."); } // We need to cut off values greater than this to avoid bias in distribution // over the range. var maxUnbiased = MAX_UINT32 - ((MAX_UINT32 + 1) % (range + 1)); var rand; do { rand = crypto.getRandomValues(new Uint32Array(1))[0]; } while (rand > maxUnbiased); var offset = rand % (range + 1); return min + offset; } console.log(randInt(-8, 8)); // -2 console.log(randInt(0, 0)); // 0 console.log(randInt(0, 0xFFFFFFFF)); // 944450079 console.log(randInt(-1, 0xFFFFFFFF)); // Uncaught Error: Range of 4294967296 covering -1 to 4294967295 is > 4294967295. console.log(new Array(24).fill().map(n => randInt(8, 12))); // [11, 8, 8, 11, 10, 8, 8, 12, 12, 12, 9, 9, // 11, 8, 11, 8, 8, 8, 11, 9, 10, 12, 9, 11] console.log(randInt(10, 8)); // Uncaught Error: max (8) must be >= min (10).
Я обнаружил, что решение Франциска выше не включало минимальное или максимальное число в результаты, поэтому я изменил его следующим образом:
function randomInt(min,max) { return Math.floor(Math.random()*(max-(min+1))+(min+1)); }
Comments