Случайные числа без повторов
26927 20.09.2015 Скачать пример
Постановка задачи
Предположим, что нам необходимо создать набор целых случайных чисел без повторов в заданном интервале значений. Примеры с ходу:
- генерация уникальных случайных кодов для товаров или пользователей
- назначение людей на задачи (каждому по случайной из списка)
- перестановки слов в поисковом запросе (привет seo-шникам)
- игра в лото и т.д.
Способ 1. Простой
Для начала рассмотрим простой вариант: нам необходимо получить случайный набор из 10 целых чисел от 1 до 10. Использование встроенной в Excel функции СЛУЧМЕЖДУ (RANDBETWEEN) уникальности не гарантирует. Если ввести ее в ячейку листа и скопировать вниз на 10 ячеек, то запросто могут случиться повторы:
Поэтому мы пойдем другим путем.
Во всех версиях Excel есть функция РАНГ (RANG), предназначенная для ранжирования или, другими словами, определения топовой позиции числа в наборе. Для самого большого числа в списке ранг=1, второе в топе имеет ранг=2 и т.д.
Введем в ячейку А2 функцию СЛЧИС (RAND) без аргументов и скопируем формулу вниз на 10 ячеек. Эта функция сгенерирует нам набор из 10 случайных дробных чисел от 0 до 1:
В соседний столбец введем функцию РАНГ, чтобы определить позицию в рейтинге для каждого полученного случайного числа:
Получим в столбце В то, что хотели — любое нужное количество неповторяющихся случайных целых чисел от 1 до 10.
Чисто теоретически, может возникнуть ситуация, когда СЛЧИС выдаст нам два одинаковых случайных числа в столбце А, их ранги совпадут и мы получим повтор в столбце В. Однако, вероятность такого сценария крайне мала, учитывая тот факт, что точность составляет 15 знаков после запятой.
Способ 2. Сложный
Этот способ чуть сложнее, но использует всего одну формулу массива. Допустим, нам нужно создать на листе список из 9 неповторяющихся случайных целых чисел в интервале от 1 до 50.
Введите в ячейку А2 следующую формулу, нажмите в конце Ctrl+Shift+Enter (чтобы ввести ее как формулу массива!) и скопируйте формулу вниз на требуемое количество ячеек:
Способ 3. Макрос
Ну и, конечно, можно решить задачу с помощью программирования на Visual Basic. В одной из старых статей про случайную выборку я уже приводил макро-функцию массива Lotto, которая выдает требуемое количество случайных неповторяющихся чисел из заданного интервала.
Ссылки по теме
- Как подсчитать количество уникальных значений в диапазоне
- Случайная выборка элементов из списка
Справочник по функциям: rand
Возвращает матрицу со случайными элементами, равномерно распределенными по
интервал (0, 1).
Аргументы обрабатываются так же, как аргументы для глаз .
Вы можете запросить состояние генератора случайных чисел, используя форму
v = ранд ("состояние")
Это возвращает вектор-столбец v длины 625. Позже вы можете восстановить генератор случайных чисел в состояние v , используя форму
рандов ("государство", в)
Вы также можете инициализировать вектор состояния из произвольного вектора длины ≤ 625 для и . Это новое состояние будет хешем, основанным на значении против , а не против .
По умолчанию генератор инициализируется с /dev/urandom , если он
доступны, в противном случае из процессорного времени, времени настенных часов и текущего
долю секунды. Обратите внимание, что это отличается от MATLAB , который
всегда инициализирует состояние в одно и то же состояние при запуске. Чтобы получить
поведение сравнимо с 9{19937}-1 (См.
М. Мацумото и Т. Нисимура, Mersenne Twister: 623-мерная равнораспределенная форма
генератор псевдослучайных чисел ,
АКМ транс. по моделированию и компьютерному моделированию Vol. 8, № 1, с. 3–30,
январь 1998 г.,
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html).
Используйте , а не для криптографии без безопасного хеширования нескольких
возвращаемые значения вместе, в противном случае состояние генератора можно узнать после
чтение 624 последовательных значений.
В старых версиях Octave использовался другой генератор случайных чисел.
Новый генератор используется по умолчанию, так как он значительно быстрее предыдущего.
старый генератор и производит случайные числа со значительно более длинным циклом
время. Однако в некоторых случаях желательно получить
те же случайные последовательности, что и старые генераторы. Для этого
ключевое слово используется для указания того, что старые генераторы должны
использоваться, как в
рандов ("сид", вал)
, который устанавливает начальное значение генератора на val .
Семя
Генератор можно запросить с помощью
с = ранд («начальное число»)
Однако следует отметить, что запрос начального числа не вызовет рандов использовать старые генераторы, только установка сид будет. Вызывать рандов , чтобы снова использовать новые генераторы, ключевое слово "состояние"
. Состояние или начальное значение генератора можно сбросить на новое случайное значение с помощью
ключевое слово "сброс" .
Класс возвращаемого значения может управляться завершающим "двойной" или "одиночный" аргумент. Это единственные действительные
классы.
См. также: ранд, ранде, ранд, ранд.
Сгенерируйте случайные числа — Видеоурок по MATLAB
Из курса: MATLAB 2018 Essential Training
Генерация случайных чисел
“
— [Преподаватель] В другом месте этого курса я показал вам, как создавать диапазоны или последовательности чисел, которые следуют шаблону.

Таким образом, это равномерное распределение. Итак, я наберу randi, за которой следует левая скобка, а затем левая квадратная скобка, затем начало диапазона, поэтому у меня есть одна запятая 100, за которой следует правая квадратная скобка, чтобы закрыть определение диапазона, правая скобка, затем Enter и я получить 13. Если бы я сделал то же самое, R-A-N-D-I левая скобка, начало списка аргументов левая квадратная скобка одна запятая 100 правая квадратная скобка правая скобка, Enter и я получаю 92 и я могу продолжать это делать. Вы также можете генерировать значения в пределах нормального распределения, и это классическая колоколообразная кривая, где значения в середине распределения имеют тенденцию встречаться чаще, чем значения в хвостах кривой. Если вам нужны нормально распределенные случайные значения от нуля до единицы, вы можете использовать функцию randn. Итак, просто введите randn и Enter, и вы получите 0,3188, снова randn, а затем вы получите — 1,3077, и снова это нормальное распределение или, точнее, стандартное нормальное распределение, поэтому оно имеет среднее или среднее значение, равное нулю, и стандартное отклонение, равное единице.