Как я могу генерировать случайные целые числа между двумя указанными переменными в JavaScript, например, x = 4
и y = 8
вывести любую из 4, 5, 6, 7, 8
?
javascript
random
integer
zacharyliu
источник
источник
Ответы:
На странице Mozilla Developer Network есть несколько примеров :
Вот логика, стоящая за этим. Это простое правило трех:
Math.random()
возвращаетNumber
от 0 (включительно) до 1 (исключая). Итак, у нас есть такой интервал:Теперь нам нужно число между
min
(включительно) иmax
(эксклюзивно):Мы можем использовать,
Math.random
чтобы получить корреспондента в интервале [min, max). Но сначала мы должны немного учесть проблему, вычитаяmin
из второго интервала:Это дает:
Теперь мы можем подать заявку,
Math.random
а затем рассчитать корреспондента. Давайте выберем случайное число:Итак, чтобы найти
x
, мы бы сделали:Не забудьте добавить
min
обратно, чтобы мы получили число в интервале [min, max):Это была первая функция от MDN. Второй возвращает целое число между
min
иmax
, оба включительно.Теперь для получения целых чисел, вы могли бы использовать
round
,ceil
илиfloor
.Вы можете использовать
Math.round(Math.random() * (max - min)) + min
, однако это дает неравномерное распределение. Обаmin
иmax
только имеют примерно половину шансов на бросок:Если
max
исключить из интервала, у него даже меньше шансов на бросок, чемmin
.У
Math.floor(Math.random() * (max - min +1)) + min
вас есть совершенно равномерное распределение.Вы не можете использовать
ceil()
и-1
в этом уравнении, потому чтоmax
теперь у вас было немного меньше шансов на бросок, но вы также можете бросить (нежелательный)min-1
результат.источник
floor
, округляя.round
, но тогда и то,min
и другое, иmax
только половина шансов катиться, как и другие числа. Вы также можете вычесть один и взятьceil
. Это, однако, оставляетmax
число с минимальным шансом на бросок из-за[0,1)
интервала.источник
(Math.random() * (maximum - minimum + 1) ) << 0
быстрее.x << 0
,x | 0
,~~x
) вместоMath.floor()
обращенныхx
в два-комплемента с гораздо меньшим диапазоном , чемNumber.MAX_SAFE_INTEGER
(2³²⁻¹ против 2⁵³), таким образом , вы должны использовать его с осторожностью!657348096152|0
получите 218099864 (1100111111111111000010011000 в двоичном формате).Math.random ()
Возвращает случайное целое число между min ( включенным ) и max ( включенным ):
Или любое случайное число между min ( включено ) и max ( не включено ):
Полезные примеры (целые числа):
** И всегда приятно напоминать (Мозилла):
источник
Применение:
сломать:
Мы возвращаем функцию (заимствование из функционального программирования), которая при вызове будет возвращать случайное целое число между значениями
bottom
иtop
включительно. Мы говорим «включительно», потому что хотим включить как нижнюю, так и верхнюю в диапазон чисел, которые могут быть возвращены. Таким образом,getRandomizer( 1, 6 )
вернется 1, 2, 3, 4, 5 или 6.(нижний номер меньше, верхний номер больше)
Math.random()
возвращает случайное двойное число от 0 до 1, и если мы умножим его на единицу плюс разница междуtop
иbottom
, мы получим двойное значение где-то между0
и1+b-a
.Math.floor
округляет число до ближайшего целого числа. Итак, теперь у нас есть все целые числа между0
иtop-bottom
. 1 выглядит сбивающим с толку, но он должен быть там, потому что мы всегда округляем, поэтому на самом деле верхнее число никогда не будет достигнуто без него. Случайные десятичные мы генерируем потребность быть в диапазоне0
от(1+top-bottom)
так мы можем округлить и получить Int в диапазоне0
доtop-bottom
Код в предыдущем примере дал нам целое число в диапазоне,
0
иtop-bottom
теперь все, что нам нужно сделать, это добавитьbottom
к этому результату, чтобы получить целое число в диапазонеbottom
иtop
включительно. : DПРИМЕЧАНИЕ. Если вы сначала передадите нецелое значение или большее число, вы получите нежелательное поведение, но если кто-то его не попросит, я не собираюсь углубляться в код проверки аргументов, поскольку он довольно далек от цели исходного вопроса. ,
источник
Альтернатива, если вы используете Underscore.js, вы можете использовать
источник
_.uniqueId()
функцию, которую вы можете вызывать для моделей на стороне клиента.x << 0
,x | 0
,~~x
) вместоMath.floor()
обращенныхx
в два-комплемент с гораздо меньшим диапазоном , чемNumber.MAX_SAFE_INTEGER
(2³²⁻¹ против 2⁵³), таким образом , вы должны использовать его с осторожностью!Вернуть случайное число от 1 до 10:
Вернуть случайное число от 1 до 100:
источник
Если вам нужна переменная между 0 и max, вы можете использовать:
источник
Другие ответы не учитывают вполне разумные параметры
0
и1
. Вместо этого вы должны использоватьround
вместо изceil
илиfloor
:источник
console.log(randomNumber(5,6)); # 9 6 6 5 7 7
9 и 7 находятся между 5 и 6? ...... Вы должны исправить это или объяснить ..Вот реализация MS DotNet случайного класса в javascript-
Использование:
источник
Используйте эту функцию, чтобы получить случайные числа между заданным диапазоном
источник
После генерации случайного числа с помощью компьютерной программы все равно считается случайным числом, является ли выбранное число частью или полным числом исходного числа. Но если оно было изменено, математики не принимают его как случайное число, и они могут назвать его необъективным числом. Но если вы разрабатываете программу для простой задачи, это не тот случай, чтобы рассмотреть. Но если вы разрабатываете программу для генерирования случайного числа для ценных вещей, таких как лотерея или азартная игра, то ваша программа будет отклонена руководством, если вы не будете рассматривать вышеупомянутый случай.
Так что для таких людей вот мое предложение:
Генерация случайного числа с помощью
Math.random()
. (Скажем этоn
)Если вы знаете, как читать таблицу случайных чисел, чтобы выбрать случайное число, вы знаете, что описанный выше процесс (умножение на 1, 10, 100 и т. Д.) Не нарушает тот, о котором я упоминал в начале (поскольку он изменяет только место десятичной точки.)
Изучите следующий пример и разработайте его для своих нужд.
Если вам нужен образец [0,9], то пол n * 10 - это ваш ответ, а если нужно [0,99], то пол n * 100 - ваш ответ и так далее.
Теперь позвольте войти в вашу роль:
Вы спросили номера среди определенного диапазона. (В этом случае вы смещены в этом диапазоне. - Если взять число из [1,6], бросив кубик, то вы смещаетесь в [1,6], но все же это случайное значение, если и только если умирание непредвзято .)
Поэтому рассмотрим ваш диапазон ==> [78, 247] количество элементов диапазона = 247 - 78 + 1 = 170; (поскольку обе границы являются включающими.
Примечание: в первом методе я сначала создал массив, который содержит нужные вам числа, а затем случайно поместил их в другой массив. Во втором методе генерируйте числа случайным образом и проверяйте, находятся ли они в нужном вам диапазоне. Затем поместите его в массив. Здесь я сгенерировал два случайных числа и использовал их общее количество, чтобы максимизировать скорость программы, сводя к минимуму частоту отказов при получении полезного числа. Однако добавление сгенерированных чисел также даст некоторую необъективность. Поэтому я бы порекомендовал мой первый метод для генерации случайных чисел в определенном диапазоне.
В обоих методах ваша консоль покажет результат (нажмите F12 в Chrome, чтобы открыть консоль)
источник
Math.floor(Math.random() * (6 - 1 + 1) + 1)
] числа 1 и 6 обязательно будут прокручиваться меньше, чем 2, 3, 4 и 5. Однако разница в принципе незначительна.Для случайного целого числа с диапазоном попробуйте:
источник
Чтобы проверить эту функцию и ее варианты, сохраните приведенный ниже HTML / JavaScript в файл и откройте его в браузере. Код создаст график, показывающий распределение одного миллиона вызовов функций. Код также будет записывать крайние случаи, поэтому, если функция выдает значение, превышающее максимальное или меньшее, чем минимальное, you.will.know.about.it.
источник
Чтобы получить случайное число, скажем, от 1 до 6, сначала выполните:
Это умножает случайное число на 6, а затем добавляет к нему 0,5. Затем округлите число до положительного целого числа, выполнив:
Это округляет число до ближайшего целого числа.
Или, чтобы сделать это более понятным, сделайте это:
В общем, код для этого с использованием переменных:
Причина удаления 0,5 от минимального значения состоит в том, что использование только минимального значения позволит вам получить целое число, которое на единицу больше вашего максимального значения. Убирая 0,5 от минимального значения, вы существенно препятствуете округлению максимального значения.
Надеюсь, это поможет.
источник
Используя следующий код, вы можете генерировать массив случайных чисел, не повторяя, в заданном диапазоне.
источник
Я знаю, что на этот вопрос уже дан ответ, но мой ответ может кому-то помочь.
Я нашел этот простой метод в W3Schools:
Надеюсь, это поможет кому-то.
источник
Случайное целое число между самым низким и самым высоким:
Не самое элегантное решение .. но что-то быстрое.
источник
Вот что я использую для генерации случайных чисел.
Мы выполняем,
high++
потому чтоMath.random()
генерирует случайное число от 0 (включительно) до 1 (исключая). Исключение означает, что мы должны увеличить максимум на единицу перед выполнением любой математики. Затем мы вычитаем низкий из высокого, давая нам наибольшее число для генерации - низкий, затем + низкий, возвращая высокий уровень к норме и делая самое низкое число по крайней мере низким. тогда мы возвращаем полученное числоrandom(7,3)
мог вернуться3,4,5,6, or 7
источник
high
как он используется только один раз, вы можете использоватьhigh-low+1
вместо него отдельный оператор приращения. Кроме того, большинство пользователей ожидают, чтоlow
параметр будет первым.Uint8Array создайте массив, заполненный числом до 3 цифр, которое будет максимум 999. Этот код очень короткий.
источник
Вот пример функции javascript, которая может генерировать случайное число любой указанной длины без использования Math.random ():
источник
это мое взятие случайного числа в диапазоне, так как я хотел получить случайное число в диапазоне от основания до показателя степени. например, base = 10, exponent = 2, дает случайное число от 0 до 100, в идеале и так далее.
если это помогает использовать это, вот оно:
источник
Math.random()
быстрый и подходящий для многих целей, но он не подходит, если вам нужны криптографически безопасные значения (это небезопасно) или если вам нужны целые числа из абсолютно равномерного несмещенного распределения (подход умножения, используемый в других ответах, дает определенные значения несколько чаще чем другие).В таких случаях мы можем использовать
crypto.getRandomValues()
для создания безопасных целых чисел и отклонить любые сгенерированные значения, которые мы не можем равномерно отобразить в целевой диапазон. Это будет медленнее, но не должно быть значительным, если вы не генерируете очень большое количество значений.Чтобы прояснить проблему смещения распределения, рассмотрим случай, когда мы хотим сгенерировать значение от 1 до 5, но у нас есть генератор случайных чисел, который выдает значения от 1 до 16 (4-битное значение). Мы хотим иметь одинаковое количество сгенерированных значений, сопоставляемых с каждым выходным значением, но 16 не делится поровну на 5: остается остаток от 1. Поэтому нам нужно отклонить 1 из возможных сгенерированных значений и продолжить только тогда, когда мы получим одно из 15 меньших значений, которые могут быть равномерно отображены в нашем целевом диапазоне. Наше поведение может выглядеть следующим образом:
В следующем коде используется аналогичная логика, но вместо этого генерируется 32-разрядное целое число, поскольку это самый большой общий целочисленный размер, который может быть представлен стандартным
number
типом JavaScript . (Это можно изменить, чтобы использоватьBigInt
s, если вам нужен больший диапазон.) Независимо от выбранного диапазона, доля сгенерированных значений, которые отклоняются, всегда будет меньше 0,5, поэтому ожидаемое количество отклонений всегда будет меньше 1,0 и обычно близко к 0.0; Вам не нужно беспокоиться о том, что это зациклится навсегда.источник
Crypto-Strong
Чтобы получить крипто-сильное случайное целое число в ragne [x, y], попробуйте
источник
Вы можете этот фрагмент кода,
источник
do - while
вместоwhile
Пусть Г. Стэн написал отличный ответ, но он был слишком сложным для меня, чтобы понять. Итак, я нашел еще более простое объяснение тех же понятий на https://teamtreehouse.com/community/mathfloor-mathrandom-max-min-1-min-explanation Джейсоном Анелло.
ПРИМЕЧАНИЕ . Единственная важная вещь, которую вы должны знать, прежде чем читать объяснение Джейсона, - это определение «усечь». Он использует этот термин при описании
Math.floor()
. Оксфордский словарь определяет «усечение» как:источник
Это может обрабатывать генерацию до 20 цифр уникального случайного числа
JS
JsFiddle
источник
/ * Написать функцию с именем,
randUpTo
которая принимает число и возвращает случайное целое число от 0 до этого числа? * // * Напишите вызываемую функцию,
randBetween
которая принимает два числа, представляющих диапазон, и возвращает случайное целое число между этими двумя числами. * // * Напишите вызываемую функцию,
randFromTill
которая принимает два числа, представляющих диапазон, и возвращает случайное число между min (включительно) и max (эксклюзивом). * // * Напишите вызываемую функцию,
randFromTo
которая принимает два числа, представляющих диапазон, и возвращает случайное целое число между min (включительно) и max (включительно) * /источник
Я сделал эту функцию, которая учитывает такие параметры, как min, max, exclude (список целых чисел, которые нужно исключить) и seed (на случай, если вам нужен генератор случайных чисел с семенами).
Может использоваться как:
Или проще:
Тогда вы можете сделать:
Суть: https://gist.github.com/madprops/757deb000bdec25776d5036dae58ee6e
источник
Math.floor округляет число до ближайшего целого
Таким образом, чтобы сгенерировать случайное целое число от 4 до 8 включительно, вызовите вышеуказанную функцию со следующими аргументами:
источник
Мой метод генерации случайного числа от 0 до n, где n <= 10 (n исключено):
источник