Перейти к содержимому

Случайные числа без повторений

Это глава из книги Билла Джелена Гуру Excel расширяют горизонты: делайте невозможное с Microsoft Excel.

Задача: вы хотите сгенерировать случайные числа между 1 и 100, но… без дубликатов. Excel стандартно предлагает функции СЛЧИС() и СЛУЧМЕЖДУ(), но обе они, генерируют совершенно случайные числа с морем дубликатов.

Предыстория: подобные задачи я обычно решаю с помощью трех дополнительных столбцов, но PGC01 (это ник участника форума) предложил немаленькую формулу, чтобы справиться с этой проблемой одним махом. Чтобы понять формулу, надо для начала познакомиться с работой функции НАИМЕНЬШИЙ(массив;k). Как правило, она возвращает k-е наименьшее значение массива. Например, =НАИМЕНЬШИЙ({69;9;12;27;42;55};3) возвращает 27, так как, 1-е наименьшее число в списке – 9, 2-е – 12, а 3-е – 27. Нечисловые значения в массиве игнорируются. Например, =НАИМЕНЬШИЙ({69;9;12;ЛОЖЬ;42;55};3) вернет 42.

Решение: сейчас мы разработаем формулу, которая будет формировать массив из неиспользованных чисел диапазона, а затем выбирать из этих чисел (рис. 1).

Рис. 1. Формула генерит наборы чисел, от 1 до 10, упорядоченные случайным образом

Рис. 1. Формула генерит наборы чисел, от 1 до 10, упорядоченные случайным образом

Скачать заметку в формате Word или pdf, примеры в формате Excel

Формула массива в ячейке В9: {=НАИМЕНЬШИЙ(ЕСЛИ(СЧЁТЕСЛИ(B$3:B8;СТРОКА($1:$10))<>1; СТРОКА($1:$10));1+ЦЕЛОЕ(СЛЧИС()*(10-СТРОКА()+СТРОКА(B$4))))}. Excel начинает расчет формулы с функции СЧЁТЕСЛИ (рис. 2 и 3). СТРОКА($1:$10) возвращает массив чисел {1, 2, 3,…10} (Е5:Е14 на рис. 2 и второй прямоугольник на рис. 3).

Рис. 2. Диапазон Е4-Н14 показывает, как вычисляется фрагмент формулы

Рис. 2. Диапазон Е4:Н14 показывает, как вычисляется фрагмент формулы

Функция СЧЁТЕСЛИ просит Excel просматривать ранее сгенерированные числа (на рис. 1 и 2 они размещены в диапазоне B$3:B8), и подсчитывать, сколько из них равны последовательно 1, 2, 3, … 10. Ответы будут 1 или 0, в зависимости от того, было ли ранее сгенерировано соответствующее число, или нет. На рис. 2 результат работы функции СЧЁТЕСЛИ помещен в столбец F. На рис. 3 – это третий прямоугольник. В ячейках G5:G14 проверяется, равен ли единице результат в F (4-й прямоугольник). Функция ЕСЛИ в столбце Н (рис. 2) проверяет значение в столбце G, и возвращает значение из столбца Е, если в G = ИСТИНА, и ЛОЖЬ, если в G =ЛОЖЬ (см. также 6-й прямоугольник на рис. 3).

Рис. 3. Последовательность вычислений

Рис. 3. Последовательность вычислений, аналогичная рис. 2

В этот момент массив для выбора следующего случайного числа (т.е., случайного числа, которое будет отражено в ячейке В9 на рис. 1) сформирован. Обратите внимание, что в столбце Н на рис. 2 и в 6-м прямоугольнике на рис. 3 представлены числа, ранее не выбиравшиеся среди случайных. Оставшаяся часть формулы призвана выбрать из них одно число случайным образом. В принципе, теперь осталась формула: =НАИМЕНЬШИЙ(Н5:Н14;СЛУЧМЕЖДУ(1;5))

На самом деле, установить, что осталось именно пять невыбранных чисел сложнее, чем в приведенной выше формуле. Чтобы сделать формулу совместимый с Excel 2003, PGC01 использует функции СЛЧИС() вместо СЛУЧМЕЖДУ(). Функция СЛЧИС возвращает случайное число между 0 и 0,99999… =ЦЕЛОЕ(СЛЧИС()*5) возвращает случайное целое число между 0 и 4. И, наконец, =1+ЦЕЛОЕ(СЛЧИС()*5) возвращает случайное целое число между 1 и 5.

Поскольку вместо 5 в этой части формулы в разных строках должны быть разные числа, вместо фиксированного значения используется фрагмент 10-СТРОКА()+СТРОКА(B$4). Для ячейки В9 он вернет 10-9+4=5.

Резюме: довольно сложная формула массива может генерировать случайные числа без повторений.

Источник: http://www.mrexcel.com/forum/showthread.php?t=222922

6 комментариев для “Случайные числа без повторений”

  1. Вячеслав

    Здравствуйте!
    Прочитал статью, заинтересовало. Но не как не могу
    понять в какие ячейки нужно вставлять формулы.
    Буду очень благодарен за ответ. Спасибо.

  2. Вячеслав, скачайте приложенный Excel-файл…

  3. Махамбет

    Здравствуйте!
    Очень полезная статья, спасибо!

    Хотел тоже самое проделать с числами от 1 до 54, но excel выдает ошибку, не пойму почему.

    Формулу поменял на такой вид:
    {=НАИМЕНЬШИЙ(ЕСЛИ(СЧЁТЕСЛИ(F$3:F3;СТРОКА($1:$54))1;СТРОКА($1:$54));1+ЦЕЛОЕ(СЛЧИС()*(54-СТРОКА()+СТРОКА(F$4))))}

    Можете подсказать в чем ошибка?

    Вложение

  4. Сергей Багузин

    Проверьте, что отображенную на картинке формулу вы вводите одновременно нажимая Ctrl+Shift+Enter. После введения формулы в ячейку F4, протяните ее вниз на 54 ячейки. Должно получиться.
    См. также Excel-файл.

    Вложение

  5. Махамбет

    Благодарю!
    не знал о таких вещах)
    теперь все понял

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *