Випадкові числа без повторів
Постановка задачі
Припустимо, що нам необхідно створити набір цілих випадкових чисел без повторів в заданому інтервалі значень. Приклади з ходу:
- генерація унікальних випадкових кодів для товарів або користувачів
- призначення людей на завдання (кожному по випадкової зі списку)
- перестановки слів в пошуковому запиті (привіт 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. яка видає необхідну кількість випадкових неповторюваних чисел із заданого інтервалу.