Чи є спосіб генерувати випадкове число у визначеному діапазоні (наприклад, від 1 до 6: 1, 2, 3, 4, 5 або 6) у JavaScript?
Math.floor((Math.random()*10)+1);не може працювати для вас, як зазначено тут на сайті w3schools.com/jsref/jsref_random.asp ..?
Чи є спосіб генерувати випадкове число у визначеному діапазоні (наприклад, від 1 до 6: 1, 2, 3, 4, 5 або 6) у JavaScript?
Math.floor((Math.random()*10)+1);не може працювати для вас, як зазначено тут на сайті w3schools.com/jsref/jsref_random.asp ..?
Відповіді:
Наступний код працює лише за мінімального значення 1. Він не працює для мінімальних значень, крім 1.
Якщо ви хочете отримати випадкове ціле число між 1 ( і лише 1 ) і 6, ви обчислите:
Math.floor(Math.random() * 6) + 1
Де:
Math.floor(Math.random() * 6) + 2значить, якщо Math.random()результат 0,99, наше випадкове значення буде7
function randomIntFromInterval(min, max) { // min and max included
return Math.floor(Math.random() * (max - min + 1) + min);
}
Що це робить "додатково" - це дозволяє випадкові інтервали, які не починаються з 1. Отже, ви можете отримати випадкове число, наприклад, від 10 до 15. Гнучкість.
toаргумент, fromаргумент подвоюється як максимум
Returns a floating-point, pseudo-random number in the range [0, 1) that is, from 0 (inclusive) up to but not including 1 (exclusive), which you can then scale to your desired range.( developer.mozilla.org/en-US/docs/JavaScript/Reference/… )
Повертає ціле випадкове число між min ( включено ) та max ( включено ):
function randomInteger(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
Або будь-яке випадкове число між min ( включено ) та max ( не включено ):
function randomNumber(min, max) {
return Math.random() * (max - min) + 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;
** І завжди приємно нагадувати (Mozilla):
Math.random () не забезпечує криптографічно захищених випадкових чисел. Не використовуйте їх для нічого, що стосується безпеки. Замість цього скористайтеся API Web Crypto, а точніше методом window.crypto.getRandomValues ().
[1,2], є 25% шанс Math.random()дасть вам ряд від одного з них [0,0.49], [0.5,0.99], [1,1.49], [1.5,1.99]. Округлення цих інтервалів призведе до 0, 1, 1, 2, що не є рівномірним розподілом. Настил їх призводить до 0, 0, 1, 1.
Math.roundover Math.floorдасть різні результати.
function getRandomInt(min, max) { return Math.round((min - 0.5) + Math.random() * (max - min + 1)); }
a | 0це також найшвидший і оптимізований спосіб перетворення рядка в ціле число. Він працює лише з рядками, що містять цілі числа ( "444"і "-444"), тобто відсутні поплавці / дроби. Це дає результат 0для всього, що не вдається. Це одна з головних оптимізацій, що стоять за asm.js.
~~(Math.random() * (50000000000000 - 0 + 1)) + 0іMath.floor(Math.random() * (50000000000000 - 0 + 1)) + 0
TL; DR
function generateRandomInteger(min, max) {
return Math.floor(min + Math.random()*(max + 1 - min))
}
Для отримання випадкового числа
generateRandomInteger(-20, 20);
Пояснення нижче
Нам потрібно отримати випадкове ціле число, скажімо, X між min та max.
Правильно?
тобто min <= X <= макс
Якщо відняти від рівняння хв, це еквівалентно
0 <= (X - хв) <= (макс - хв)
Тепер давайте помножимо це на випадкове число r, яке є
0 <= (X - хв) * r <= (max - хв) * r
Тепер давайте додаємо хв до рівняння
min <= min + (X - min) * r <= min + (max - min) * r
Тепер виберемо функцію, в результаті якої r така, що вона відповідає нашому діапазону рівнянь як [min, max]. Це можливо лише в тому випадку, якщо 0 <= r <= 1
ДОБРЕ. Тепер діапазон r, тобто [0,1], дуже схожий на результат функції Math.random (). Чи не так?
Функція Math.random () повертає псевдовипадкове число з плаваючою комою в діапазоні [0, 1); тобто від 0 (включно) до 1, але не включаючи 1 (виключно)
Наприклад,
min+ 0 * ( max- min) = хв
min+ 1 * ( max- min) = макс
min+ r * ( max- min) = X , де X має діапазон min <= X < max
Вищенаведений результат X є випадковим числовим числом. Однак завдяки Math.random () наша ліва межа включена, а права межа виключна. Для включення правої межі ми збільшуємо праву межу на 1 і поверх результату.
function generateRandomInteger(min, max) {
return Math.floor(min + Math.random()*(max + 1 - min))
}
generateRandomInteger(-20, 20);
Або в підкресленні
_.random(min, max)
var x = 6; // can be any number
var rand = Math.floor(Math.random()*x) + 1;
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.
min + Math.random() * maxдасть вам цифри між min та min + max, що не те, що ви хочете. Перша гілка ifє правильною, але її можна спростити return min + Math.random() * (max - min), що є правильним рішенням, незалежно від того, позитивний чи негативний мінус (див. Інші відповіді). Крім того, майте на увазі, що вам все одно потрібно підбити результат, якщо ви не хочете дробів.
Я написав більш гнучку функцію, яка може дати вам випадкове число, але не тільки ціле число.
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
Виправлена версія.
Приклад
Повернути випадкове число між 1 і 10:
Math.floor((Math.random() * 10) + 1);
Результатом може бути:
3
Спробуйте самі: тут
-
або використовуючи lodash / unescore:
_.random(min, max)
Незважаючи на багато відповідей і майже такий самий результат. Я хотів би додати свою відповідь і пояснити її роботу. Тому що важливо зрозуміти його роботу, а не копіювати вставлення одного коду рядка. Генерація випадкових чисел - це не що інше, як проста математика.
КОД:
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));
}
Math.random() швидко і підходить для багатьох цілей, але це не доречно, якщо вам потрібні криптографічно захищені значення (це не захищено) або якщо вам потрібні цілі числа з цілком рівномірного неупередженого розподілу (підхід множення, який використовується в інших відповідях, дає певні значення трохи частіше ніж інші).
У таких випадках ми можемо використовувати crypto.getRandomValues()для створення захищених цілих чисел та відхиляти будь-які згенеровані значення, які ми не можемо рівномірно відобразити у цільовий діапазон. Це буде повільніше, але воно не повинно бути суттєвим, якщо ви не генеруєте надзвичайно велику кількість значень.
Для уточнення проблеми з упередженим розподілом розглянемо випадок, коли ми хочемо генерувати значення від 1 до 5, але у нас є генератор випадкових чисел, який виробляє значення між 1 і 16 (4-бітове значення). Ми хочемо, щоб однакове число згенерованих значень відображалося на кожне вихідне значення, але 16 не ділиться рівно на 5: воно залишає залишок 1. Отже, нам потрібно відхилити 1 можливих згенерованих значень і продовжувати лише тоді, коли отримаємо одне з 15 менших значень, яке можна рівномірно відобразити в нашому цільовому діапазоні. Наша поведінка може виглядати приблизно так:
Generate a 4-bit integer in the range 1-16.
If we generated 1, 6, or 11 then output 1.
If we generated 2, 7, or 12 then output 2.
If we generated 3, 8, or 13 then output 3.
If we generated 4, 9, or 14 then output 4.
If we generated 5, 10, or 15 then output 5.
If we generated 16 then reject it and try again.
У наведеному нижче коді використовується аналогічна логіка, але натомість генерується 32-бітове ціле число, оскільки це найбільший загальний розмір цілих чисел, який може бути представлений стандартним numberтипом JavaScript . (Це може бути змінено для використання BigInts, якщо вам потрібен більший діапазон.) Незалежно від обраного діапазону, частка генерованих значень, які відхиляються, завжди буде менше 0,5, тому очікувана кількість відхилень завжди буде менше 1,0 і зазвичай близький до 0,0; вам не потрібно турбуватися про це петлі назавжди.
const randomInteger = (min, max) => {
const range = max - min;
const maxGeneratedValue = 0xFFFFFFFF;
const possibleResultValues = range + 1;
const possibleGeneratedValues = maxGeneratedValue + 1;
const remainder = possibleGeneratedValues % possibleResultValues;
const maxUnbiased = maxGeneratedValue - remainder;
if (!Number.isInteger(min) || !Number.isInteger(max) ||
max > Number.MAX_SAFE_INTEGER || min < Number.MIN_SAFE_INTEGER) {
throw new Error('Arguments must be safe integers.');
} else if (range > maxGeneratedValue) {
throw new Error(`Range of ${range} (from ${min} to ${max}) > ${maxGeneratedValue}.`);
} else if (max < min) {
throw new Error(`max (${max}) must be >= min (${min}).`);
} else if (min === max) {
return min;
}
let generated;
do {
generated = crypto.getRandomValues(new Uint32Array(1))[0];
} while (generated > maxUnbiased);
return min + (generated % possibleResultValues);
};
console.log(randomInteger(-8, 8)); // -2
console.log(randomInteger(0, 0)); // 0
console.log(randomInteger(0, 0xFFFFFFFF)); // 944450079
console.log(randomInteger(-1, 0xFFFFFFFF));
// Error: Range of 4294967296 covering -1 to 4294967295 is > 4294967295.
console.log(new Array(12).fill().map(n => randomInteger(8, 12)));
// [11, 8, 8, 11, 10, 8, 8, 12, 12, 12, 9, 9]
Додавання floatверсії з фіксованою точністю на основі intверсії у відповіді @ Франциска:
function randomFloatFromInterval (min, max, fractionDigits) {
const fractionMultiplier = Math.pow(10, fractionDigits)
return Math.round(
(Math.random() * (max - min) + min) * fractionMultiplier,
) / fractionMultiplier
}
тому:
randomFloatFromInterval(1,3,4) // => 2.2679, 1.509, 1.8863, 2.9741, ...
і для int відповіді
randomFloatFromInterval(1,3,0) // => 1, 2, 3
Крипто-сильне випадкове ціле число в діапазоні [a, b] (припущення: a <b)
let rand= (a,b)=> a+(b-a+1)*crypto.getRandomValues(new Uint32Array(1))[0]/2**32|0
console.log( rand(1,6) );
На це дев'ять років пізніше, але randojs.com робить це простим однолінійним :
rando(1, 6)
Вам просто потрібно додати це до голови вашого html-документа, і ви можете легко робити все, що завгодно, з випадковістю. Випадкові значення масивів, випадкових елементів jquery, випадкових властивостей об'єктів і навіть запобігання повторень у разі потреби.
<script src="https://randojs.com/1.0.0.js"></script>
Це працює для мене і створює такі значення, як стандартна бібліотечна функція Python: random.randint :
function randint(min, max) {
return Math.round((Math.random() * Math.abs(max - min)) + min);
}
console.log("Random integer: " + randint(-5, 5));
Спробуйте використовувати:
function random(min, max) {
return Math.round((Math.random() *( Math.abs(max - min))) + min);
}
console.log(random(1, 6));