Как с помощью JavaScript сгенерировать уникальные случайные числа от 1 до 100?
javascript
random
integer
numbers
точечный
источник
источник
Ответы:
Например: чтобы сгенерировать 8 уникальных случайных чисел и сохранить их в массиве, вы можете просто сделать это:
источник
Returns a random number between 0 (inclusive) and 1 (exclusive)
. Еслиthe Math.random()
случайно возвращается 0, тоMath.ceil(0)
также будет 0, хотя вероятность невысока.источник
randlines file | head -10
.Создать перестановку из 100 чисел, а затем выберите последовательно.
Используйте алгоритм Knuth Shuffle (он же Fisher-Yates shuffle) .
JavaScript:
КОД, КОПИРОВАННЫЙ ПО ССЫЛКЕ.
ИЗМЕНИТЬ :
Улучшенный код:
Потенциальная проблема:
Предположим, у нас есть массив из 100 чисел {например, [1,2,3 ... 100]}, и мы перестаем менять местами после 8 перестановок; тогда в большинстве случаев массив будет выглядеть как {1,2,3,76,5,6,7,8, ... числа здесь будут перемешаны ... 10}.
Поскольку каждое число будет поменяться местами с вероятностью 1/100, так что, вероятно,. замены первых 8 номеров составляет 8/100, тогда как вероятность. из подмены других 92 это 92/100.
Но если мы запустим алгоритм для полного массива, то мы уверены (почти), что каждая запись поменяется местами.
В противном случае возникает вопрос: какие 8 чисел выбрать?
источник
Современное решение JS с использованием Set (и средний случай O (n))
источник
Math.floor(Math.random()*100) + 1
Set
JS! Однако не приведет ли это решение к ненужной генерации чисел до тех пор, пока одно из них не будет соответствовать требованию уникальности, особенно на последних итерациях, если 8 было ближе к 100? Таким образом, я думаю, что предпочитаю также элегантный ответsort
ниже.Вышеупомянутые методы хороши, если вы хотите избежать использования библиотеки, но в зависимости от того, согласны ли вы с библиотекой, я бы предложил проверить Chance для генерации случайных вещей в JavaScript.
Конкретно решить ваш вопрос с помощью Chance так же просто, как:
Отказ от ответственности, как автор Chance, я немного предвзят;)
источник
var codes = chance.unique(chance.string, 8)
Если вам нужны коды, извлеченные из определенного пула символов, вы можете указать это следующим образом:chance.unique(chance.string, 8, {pool: "abcd1234"})
где abcd1234 может быть любым символом, который вы хотите в пуле. См. Chancejs.com/#stringchance.string({ length: 8 })
и если вы хотите, чтобы в этой строке отображались только определенные символы,chance.string({ pool: 'abcd1234', length: 8 })
которая будет возвращать случайную строку из 8 символов из символов abcd1234, например, «2c2c44bc» или «331141cc»Чтобы избежать долгих и ненадежных перетасовок, я бы сделал следующее ...
Вуаля - никаких повторяющихся цифр.
Я могу опубликовать реальный код позже, если кому-то интересно.
Изменить: это, вероятно, соревновательная полоса во мне, но, увидев сообщение @Alsciende, я не мог удержаться от публикации кода, который я обещал.
источник
Другой подход - создать массив из 100 элементов с возрастающими числами и отсортировать его случайным образом. На самом деле это приводит к очень короткому и (на мой взгляд) простому фрагменту.
источник
sort
хорошо реализовано, в чем я уверен).Я бы сделал это:
источник
Это очень общая функция, которую я написал для генерации случайных уникальных / неуникальных целых чисел для массива. Предположим, что последний параметр верен в этом сценарии для этого ответа.
Здесь tempObj - очень полезный объект, поскольку каждое сгенерированное случайное число будет напрямую проверять в этом tempObj, если этот ключ уже существует, если нет, то мы уменьшаем i на единицу, поскольку нам нужен 1 дополнительный прогон, так как текущее случайное число уже существует. .
В вашем случае запустите следующее
Вот и все.
источник
min = (min) ? min : 1,
всегда возвращает 1. (поэтому 0 никогда не будет выбран)Перетасовка чисел от 1 до 100 является правильной базовой стратегией, но если вам нужно только 8 перемешанных чисел, нет необходимости перемешивать все 100 чисел.
Я не очень хорошо знаю Javascript, но считаю, что быстро создать массив из 100 нулей легко. Затем в течение 8 раундов вы меняете местами n-й элемент массива (n начиная с 0) на случайно выбранный элемент от n + 1 до 99. Конечно, любые еще не заполненные элементы означают, что элемент действительно был исходный индекс плюс 1, так что его легко учесть. Когда вы закончите с 8 раундами, первые 8 элементов вашего массива будут иметь ваши 8 перемешанных чисел.
источник
короче, чем другие ответы, которые я видел
источник
Тот же алгоритм перестановки, что и The Machine Charmer, но с прототипированной реализацией. Лучше подходит для большого количества пиков. Использует назначение деструктуризации js 1.7, если доступно.
Изменить: другое предложение, лучше подходящее для небольшого количества выборов, основанное на ответе белугабоба. Чтобы гарантировать уникальность, мы удаляем выбранные числа из массива.
источник
для массивов с такими отверстиями
[,2,,4,,6,7,,]
потому что моя проблема заключалась в том, чтобы заполнить эти дыры. Поэтому я изменил его по своему усмотрению :)следующее модифицированное решение сработало для меня :)
источник
Лучший предыдущий ответ - это ответ
sje397
. Вы получите как можно больше случайных чисел и как можно быстрее.Мое решение очень похоже на его решение. Однако иногда вам нужны случайные числа в случайном порядке, и поэтому я решил опубликовать ответ. Кроме того, я предоставляю общую функцию.
источник
Вот моя версия ES6, которую я сколотил. Я уверен, что его можно немного закрепить.
источник
Как насчет использования свойств объекта в качестве хеш-таблицы ? Таким образом, ваш лучший сценарий - рандомизировать только 8 раз. Это будет эффективно только в том случае, если вам нужна небольшая часть диапазона чисел. Кроме того, он требует гораздо меньше памяти, чем Fisher-Yates, потому что вам не нужно выделять место для массива.
Затем я обнаружил, что Object.keys (obj) - это функция ECMAScript 5, поэтому в настоящее время все вышесказанное практически бесполезно в Интернете. Не бойтесь, потому что я сделал его совместимым с ECMAScript 3, добавив такую функцию клавиш.
источник
источник
если вам нужно больше уникальности, вы должны создать массив (1..100).
приведенный выше код работает быстрее:
extractUniqueRandomArray (50) => [2, 79, 38, 59, 63, 42, 52, 22, 78, 50, 39, 77, 1, 88, 40, 23, 48, 84, 91, 49, 4, 54, 93, 36, 100, 82, 62, 41, 89, 12, 24, 31, 86, 92, 64, 75, 70, 61, 67, 98, 76, 80, 56, 90, 83, 44, 43, 47, 7, 53]
источник
Добавление другой лучшей версии того же кода (принятый ответ) с помощью функции indexOf JavaScript 1.6. Не нужно перебирать весь массив каждый раз, когда вы проверяете дубликат.
Более старая версия Javascript все еще может использовать версию сверху
PS: Пытался предложить обновление вики, но оно было отклонено. Я все еще думаю, что это может быть полезно другим.
источник
Это мое личное решение:
Он случайным образом генерирует 8 уникальных значений массива (от 0 до 7), а затем отображает их с помощью окна предупреждения.
источник
Я думаю, что этот метод отличается от методов, приведенных в большинстве ответов, поэтому я подумал, что могу добавить здесь ответ (хотя вопрос был задан 4 года назад).
Мы генерируем 100 случайных чисел и помечаем каждое из них числами от 1 до 100. Затем мы сортируем эти помеченные случайные числа, и теги перемешиваются случайным образом. В качестве альтернативы, при необходимости в этом вопросе, можно было бы просто найти 8 первых помеченных случайных чисел. Найти 8 лучших элементов дешевле, чем сортировать весь массив.
Здесь следует отметить, что алгоритм сортировки влияет на этот алгоритм. Если используемый алгоритм сортировки стабилен, есть небольшое смещение в пользу меньших чисел. В идеале мы бы хотели, чтобы алгоритм сортировки был нестабильным и даже не был склонен к стабильности (или нестабильности), чтобы давать ответ с идеально однородным распределением вероятностей.
источник
Это может обрабатывать генерацию УНИКАЛЬНЫХ случайных чисел до 20 цифр.
JS
jsFiddle
источник
Это решение использует хэш, который намного эффективнее O (1), чем проверка того, находится ли он в массиве. Также есть дополнительные безопасные проверки. Надеюсь, поможет.
источник
Реализация этого как генератора делает работу с ним довольно приятной. Обратите внимание, что эта реализация отличается от тех, которые требуют перетасовки всего входного массива в первую очередь.
Я решил реализовать
sample
таким образом, чтобы не изменять входной массив, но вы легко можете утверждать, что реализация с изменением является благоприятной.Например,
shuffle
функция может захотеть изменить исходный входной массив. Или вы можете захотеть выбрать один и тот же ввод в разное время, обновляя ввод каждый раз.sample
больше не является чистой функцией из-за мутации входных данных массива, но в определенных обстоятельствах (показанных выше) это может иметь больше смысла.Еще одна причина, по которой я выбрал генератор вместо функции, которая просто возвращает массив, заключается в том, что вы можете продолжать выборку до определенного условия.
Возможно, мне нужно первое простое число из списка 1000000 случайных чисел.
Поскольку мы работаем с генератором, эта задача тривиальна.
Это будет непрерывно выбирать одно случайное число за раз,
x
проверять, является ли оно простым, а затем возвращать,x
если оно есть. Если список чисел исчерпан до того, как найдено простое число,NaN
возвращается.Примечание:
Первоначально этот ответ был разделен на другой вопрос, который был закрыт как дубликат этого. Поскольку он сильно отличается от других решений, представленных здесь, я решил поделиться им и здесь.
источник
источник
Самый
Set
быстрый вариант - использовать. Вот общая функция для получения уникального случайного числа, использующая генератор обратного вызова. Теперь это быстро и многоразово .источник
Это реализация Fisher Yates / Durstenfeld Shuffle , но без фактического создания массива, что снижает сложность пространства или необходимую память, когда размер выбора мал по сравнению с количеством доступных элементов.
Чтобы выбрать 8 чисел из 100, необязательно создавать массив из 100 элементов.
Предполагая, что массив создан,
rnd
) от 1 до 100rnd
Если массив не создан, можно использовать hashMap для запоминания фактических поменяемых местами позиций. Когда второе сгенерированное случайное число равно одному из ранее сгенерированных чисел, карта предоставляет текущее значение в этой позиции, а не фактическое значение.
источник
Вот пример 5 случайных чисел, взятых из диапазона от 0 до 100 (включая 0 и 100) без дублирования.
источник
Вы также можете сделать это с помощью одного лайнера, например:
[...((add, set) => add(set, add))((set, add) => set.size < 8 ? add(set.add(Math.floor(Math.random()*100) + 1), add) : set, new Set())]
источник