Создайте функцию, которая будет выводить набор различных случайных чисел, взятых из диапазона. Порядок элементов в наборе не важен (их можно даже отсортировать), но должно быть возможным, чтобы содержимое набора было разным при каждом вызове функции.
Функция получит 3 параметра в любом порядке:
- Количество чисел в выходном наборе
- Нижний предел (включительно)
- Верхний предел (включительно)
Предположим, что все числа являются целыми числами в диапазоне от 0 (включительно) до 2 31 (исключая). Вывод может быть передан обратно любым удобным для вас способом (запись в консоль, в виде массива и т. Д.)
судейство
Критерии включают 3 R
- Время выполнения - протестировано на четырехъядерном компьютере с Windows 7 с любым свободно или легко доступным компилятором (при необходимости укажите ссылку)
- Надежность - обрабатывает ли функция угловые случаи или попадет в бесконечный цикл или выдаст неверные результаты - допустимо исключение или ошибка при неверном вводе
- Случайность - она должна давать случайные результаты, которые трудно предсказать со случайным распределением. Использование встроенного генератора случайных чисел в порядке. Но не должно быть никаких явных предубеждений или очевидных предсказуемых закономерностей. Должен быть лучше, чем генератор случайных чисел, используемый бухгалтерией в Дилберте
Если он устойчивый и случайный, он сводится к времени выполнения. Неспособность быть устойчивым или случайным сильно вредит его положению.
code-challenge
fastest-code
number
random
Джим Маккит
источник
источник
Ответы:
питон
Я, вероятно, только что изобрел какой-то известный алгоритм, но идея состоит в том, чтобы (концептуально) выполнить частичное перемешивание по Фишеру-Йейтсу диапазона,
lower..upper
чтобы получитьn
префикс длины равномерно перемешанного диапазона.Конечно, хранить весь диапазон было бы довольно дорого, поэтому я храню только те места, где элементы были поменяны местами.
Таким образом, алгоритм должен хорошо работать как в случае, когда вы выбираете числа из узкого диапазона (например, 1000 чисел в диапазоне 1..1000), так и в случае, когда вы выбираете числа из большого диапазона ,
Я не уверен насчет качества случайности встроенного генератора в Python, но относительно просто заменить любой генератор, который может генерировать целые числа равномерно из некоторого диапазона.
источник
Python 2.7
Не уверен, что вы стоите на использовании встроенных случайных методов, но все равно вы идете. хороший и короткий
редактировать: только что заметил, что range () не любит создавать большие списки. приводит к ошибке памяти. посмотрим, есть ли другой способ сделать это ...
edit2: диапазон был неправильной функцией, xrange работает. Максимальное целое число на самом деле
2**31-1
для питонатестовое задание:
источник
С
Возвращает массив, содержащий x уникальных случайных чисел между min и max. (звонящий должен освободить)
Работает, генерируя x последовательных случайных целых чисел в диапазоне, затем перетасовывая их. Добавьте
seed(time)
где-нибудь в вызывающей, если вы не хотите, чтобы одинаковые результаты при каждом запуске.источник
Ruby> = 1.8.7
источник
р
источник
Вопрос не правильный. Вам нужна единообразная выборка или нет? В случае, когда необходима равномерная выборка, у меня есть следующий код в R, который имеет среднюю сложность O ( s log s ), где s - размер выборки.
Конечно, можно переписать его на C для лучшей производительности. Сложность этого алгоритма обсуждается в: Rouzankin, PS; Войтишек А.В. О стоимости алгоритмов случайного выбора. Применение методов Монте-Карло 5 (1999), № 1, 39-54. http://dx.doi.org/10.1515/mcma.1999.5.1.39
Вы можете просмотреть эту статью для другого алгоритма с той же средней сложностью.
Но если вам не нужна единообразная выборка, а требуется только, чтобы все выборочные числа были разными, то ситуация кардинально меняется. Нетрудно написать алгоритм со средней сложностью O ( s ).
См. Также для равномерной выборки: П. Гупта, Г. П. Бхаттачарджи. (1984) Эффективный алгоритм случайной выборки без замены. Международный журнал по компьютерной математике 16: 4, страницы 201-209. DOI: 10.1080 / 00207168408803438
Теухола, Дж. И Невалайнен, О. 1982. Два эффективных алгоритма для случайной выборки без замены. / IJCM /, 11 (2): 127–140. DOI: 10.1080 / 00207168208803304
В последней статье авторы используют хеш-таблицы и утверждают, что их алгоритмы имеют сложность O ( s ). Есть еще один быстрый алгоритм хеш-таблицы, который скоро будет реализован в pqR (довольно быстрый R): https://stat.ethz.ch/pipermail/r-devel/2017-October/075012.html
источник
APL,
1822 байтаОбъявляет анонимную функцию, которая принимает два аргумента
⍺
и⍵
.⍺
число случайных чисел, которые вы хотите,⍵
это вектор, содержащий нижнюю и верхнюю границы, в этом порядке.a?b
выбираетa
случайные числа от 0 доb
замены. Взяв⍵[1]-⍵[0]
мы получаем размер диапазона. Затем мы выбираем⍺
числа (см. Ниже) из этого диапазона и добавляем нижнюю границу. В C это будет⍺
раз без замены. Скобки не нужны, потому что APL работает справа налево.Предполагая, что я правильно понял условия, это не соответствует критериям «робастности», потому что функция потерпит неудачу, если ей будут предоставлены неправильные аргументы (например, передача вектора вместо скаляра as⍺
).В случае, если
⍺
это вектор, а не скаляр,1↑⍺
берется первый элемент⍺
. Для скаляра это сам скаляр. Для вектора это первый элемент. Это должно привести к тому, что функция будет соответствовать критериям «надежности».Пример:
источник
{⍵+⍺?⎕-⍵}
должно быть достаточно, когда подсказка для верхней границы, а правая аргумент для нижнейScala
скомпилируйте и запустите:
Во второй строке будет выполнено 200 тестов с 15 значениями от 0 до 100, потому что Scala генерирует быстрый байт-код, но требует некоторого времени запуска. Таким образом, 200 начинается с 15 значений от 0 до 100 потребует больше времени.
Образец на одноядерном 2 ГГц:
Логика:
Использование встроенного случайного и рекурсивного выбора чисел в диапазоне (max-min), добавление min и проверка, является ли размер набора ожидаемым размером.
Критика:
источник
Схема
Не уверен, почему вам нужно 3 переданных параметра, и почему мне нужно принять любой диапазон ...
источник
р
источник
C ++
Этот код лучше всего подходит для рисования большого количества образцов из диапазона.
источник
max-min
не намного больше, чемn
. Кроме того, выходная последовательность монотонно увеличивается, поэтому вы получаете случайность с очень низким качеством, но при этом платитеrand()
несколько раз за каждый результат. Случайное перемешивание массива, вероятно, будет стоить дополнительного времени выполнения.Q (19 символов)
Затем используйте f [x; y; z] как [число чисел в выходном наборе; начальная точка; размер диапазона]
например, f [5; 10; 10] выведет 5 различных случайных чисел от 10 до 19 включительно.
Приведенные выше результаты показывают производительность при 100 000 итераций при выборе 100 случайных чисел в диапазоне от 1 до 10000.
источник
R, 31 или 40 байт (в зависимости от значения слова «диапазон»)
Если вход имеет 3 числа,
a[1], a[2], a[3]
и под «диапазоном» вы подразумеваете «целочисленную последовательность от [2] до [3]», то у вас есть это:Если у вас есть массив,
n
из которого вы собираетесь выполнить повторную выборку, но с ограничением нижнего и верхнего пределов, например «повторная выборка значений данного массиваn
из диапазонаa[1]...a[2]
», используйте это:Я весьма удивлен, почему предыдущий результат не был сыгран в гольф, учитывая встроенный образец с заменой оборудования! Мы создаем вектор, который удовлетворяет условию диапазона, и повторно выбираем его.
источник
0:(2^31)
вызываетError: cannot allocate a vector of size 16.0 Gb
Javascript (с использованием внешней библиотеки) (64 байта / 104 байта ??)
Ссылка на lib: https://github.com/mvegh1/Enumerable/
Объяснение кода: лямбда-выражение принимает min, max, count в качестве аргументов. Создайте коллекцию размером n и отобразите каждый элемент на случайное число, соответствующее критерию мин / макс. Преобразовать в собственный массив JS и вернуть его. Я запустил это также на входе размером 5 000 000, и после применения отличного преобразования все еще показывал 5 000 000 элементов. Если будет достигнуто согласие о том, что это недостаточно безопасно для гарантии отличимости, я обновлю ответ
Я включил некоторую статистику в изображение ниже ...
РЕДАКТИРОВАТЬ: ниже изображение показывает код / производительность, которая гарантирует, что каждый элемент будет отличаться. Это намного медленнее (6,65 секунды для 50 000 элементов) по сравнению с исходным кодом выше для тех же аргументов (0,012 секунды)
источник
K (ок) , 14 байтов
Решение:
Попробуйте онлайн!
Пример:
Объяснение:
Принимает 3 неявных ввода в спецификации:
x
, количество чисел в выходном наборе,y
нижний предел (включительно)z
, верхний предел (включительно)Ноты:
Также полиглот
q/kdb+
с дополнительным набором скобок:{y+((-)x)?1+z-y}
(16 байт).источник
Аксиома + ее библиотека
Вышеупомянутая функция f () возвращает в качестве ошибки пустой список, в случае f (n, a, b) с a> b. В других случаях неправильного ввода, он не запускается с одним сообщением об ошибке в окне Axiom, потому что аргумент будет неправильного типа. Примеры
источник