Как составить число с неповторяющимися числами

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

Постановка задачи

Предположим, что нам необходимо создать набор целых случайных чисел без повторов в заданном интервале значений. Примеры с ходу:

  • генерация уникальных случайных кодов для товаров или пользователей
  • назначение людей на задачи (каждому по случайной из списка)
  • перестановки слов в поисковом запросе (привет seo-шникам)
  • игра в лото и т.д.

Способ 1. Простой

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

random-unique3.png

Поэтому мы пойдем другим путем.

Во всех версиях Excel есть функция РАНГ (RANG), предназначенная для ранжирования или, другими словами, определения топовой позиции числа в наборе. Для самого большого числа в списке ранг=1, второе в топе имеет ранг=2 и т.д.

Введем в ячейку А2 функцию СЛЧИС (RAND) без аргументов и скопируем формулу вниз на 10 ячеек. Эта функция сгенерирует нам набор из 10 случайных дробных чисел от 0 до 1:

random-unique1.png

В соседний столбец введем функцию РАНГ, чтобы определить позицию в рейтинге для каждого полученного случайного числа:

random-unique2.png

Получим в столбце В то, что хотели — любое нужное количество неповторяющихся случайных целых чисел от 1 до 10.

Чисто теоретически, может возникнуть ситуация, когда СЛЧИС выдаст нам два одинаковых случайных числа в столбце А, их ранги совпадут и мы получим повтор в столбце В. Однако, вероятность такого сценария крайне мала, учитывая тот факт, что точность составляет 15 знаков после запятой.

Способ 2. Сложный

Этот способ чуть сложнее, но использует всего одну формулу массива. Допустим, нам нужно создать на листе список из 9 неповторяющихся случайных целых чисел в интервале от 1 до 50.

Введите в ячейку А2 следующую формулу, нажмите в конце Ctrl+Shift+Enter (чтобы ввести ее как формулу массива!) и скопируйте формулу вниз на требуемое количество ячеек:

random-unique4.png

Способ 3. Макрос

Ну и, конечно, можно решить задачу с помощью программирования на Visual Basic. В одной из старых статей про случайную выборку я уже приводил  макро-функцию массива Lotto, которая выдает требуемое количество случайных неповторяющихся чисел из заданного интервала.

Ссылки по теме

  • Как подсчитать количество уникальных значений в диапазоне
  • Случайная выборка элементов из списка

Интересный вопрос! Спасибо за математическую задачу по комбинаторике, попробую ответить.

У нас четырёхзначное натуральное число. По условию ни одна из цифр не должна встретиться более одного раза.

Для первой позиции (разряд тысяч) мы имеем девять возможных вариантов: все цифры от 1 до 9. Ноль нам не годится, поскольку целые числа по правилам математики не могут начинаться с нуля.

Для второй позиции, то есть для разряда сотен, мы имеем также девять вариантов. Первая использованная нами цифра уже выбыла из соревнования. Допустим, если это была двойка, то она выбыла. Но зато добавился ноль!

Для третьей цифры (разряд десятков) мы имеем уже только восемь вариантов.

И, наконец, для четвёртой цифры — это разряд единиц — остаётся лишь семь вариантов.

Чтобы найти итоговое количество всевозможных различных натуральных четырёхзначных чисел без повторяющихся цифр, нам нужно вышеуказанные 4 числа перемножить. Получим: 9 * 9 * 8 * 7 = 4536.

P. S. Всё-таки хочу свой ответ отредактировать, так как почему-то мне показалось после размышлений, что решил я не вполне верно и что речь шла о комбинациях цифр, а не о натуральных числах.

Если речь в вопросе идёт именно о комбинациях, например, это подбор комбинаций для сейфа, то ответ изменится. В комбинациях первой цифрой может быть и ноль.

В этом случае правильных комбинаций будет больше. А именно: 10 * 9 * 8 * 7 = 5040.

Итак, если в задаче подразумевается, что ноль может быть и первой цифрой тоже, то тогда правильный ответ таков: 5040 различных комбинаций. Это уже мой окончательный ответ.

Общая идея довольно проста – генерируем первое число, добавляем его в массив, генерируем второе число, проверяем его наличие в массиве (с помощью цикла, например), если сгенерированное число уже содержится в массиве, генерируем следующее, если не содержится – добавляем его туда.

Предложу такой вариант:

final int N = 9;
ArrayList<Integer> arrayList = new ArrayList<>(N);
Random random = new Random();

while (arrayList.size() < N) {
    int i = random.nextInt(N) + 1;
    if (!arrayList.contains(i)) {
        arrayList.add(i);
    }
}

int[] randomArray = arrayList.stream().mapToInt(i -> i).toArray();

Этот вариант – самый тривиальный: создаем ArrayList<Integer> и наполняем его 9-ю псевдослучайными числами. Если очередное сгенерированное число уже содержится в списке – пропускаем его и генерируем следующее.

В этом варианте, в среднем, список заполняется за 25 итераций цикла.

Как альтернативный вариант – можно использовать любую коллекцию, реализующую интерфейс Set – они хранят только неповторяющиеся элементы.

Принципиально другой вариант – заполнить список элементами по-порядку, а потом перемешать их:

final int N = 9;
ArrayList<Integer> arrayList = new ArrayList<>(N);
for (int i=1; i<=N; i++) {
    arrayList.add(i);
}

Random random = new Random();

for (int i=0; i<N; i++) {
    int j = random.nextInt(N);
    if (j != i) {
        int tmp = arrayList.get(i);
        arrayList.set(i, arrayList.get(j));
        arrayList.set(j, tmp);
    }
}

int[] randomArray = arrayList.stream().mapToInt(i -> i).toArray();

Насколько я понял, задача учебная, поэтому выше привел простейший код перемешивания элементов. Но на практике лучше использовать что-нибудь готовое, например, Collections.shuffle(...).

В таблицах Microsoft Excel часто используется нумерация различного характера, но она не всегда должна быть последовательной. В некоторых случаях юзеру требуется создать список с уникальными числами, который может быть довольно длинным, из-за чего ручной ввод становится проблемой. В программе доступны вспомогательные инструменты, которые помогут автоматизировать этот процесс и создать неограниченное количество случайных чисел.

Способ 1: Использование функции СЛУЧМЕЖДУ

В Excel есть встроенная функция, автоматически выбирающая случайное число из заданного диапазона. Вы можете использовать ее в том случае, если в списке приемлемы повторы. Для генерирования случайных неповторяющихся чисел лучше обратитесь к следующему способу ниже.

  1. Выберите первую клетку списка с числами и объявите формулу =СЛУЧМЕЖДУ().Добавление функции для создания списка случайных чисел в Microsoft Excel

  2. Введите нижнюю границу (минимальное допустимое число), после которого поставьте точку с запятой.Выбор минимального порога для создания списка случайных чисел в Microsoft Excel

  3. Введите максимально допустимое число, закройте круглую скобку, если не сделали этого ранее, и нажмите по клавише Enter для применения функции.Выбор максимального порога для создания списка случайных чисел в Microsoft Excel

  4. Вы увидите, как в ячейке отобразилось случайное число, а это значит, что функция работает исправно.Применение функции для создания списка случайных чисел в Microsoft Excel

  5. Теперь ее можно растянуть на все остальные клетки, входящие в список, чтобы получить подходящий для вас результат.Растягивание функции для создания списка случайных чисел в Microsoft Excel

Комьюнити теперь в Телеграм

Подпишитесь и будьте в курсе последних IT-новостей

Подписаться

Способ 2: Создание списка со случайными неповторяющимися числами

К сожалению, пока возможности Excel в плане рандомного генератора ограничены описанной выше функцией, и создать список со случайными неповторяющимися числами в пару кликов не получится. Однако можно при помощи вспомогательных инструментов достичь желаемого результата, зная всего пару хитростей.

  1. Создайте первое случайное число в ячейке A2, выполнив операцию сложения с любым для вас шагом. Это может быть +1, +3 или даже +10. То есть каждое следующее число будет больше предыдущего на указанный шаг.Создание первой функции суммы для создания списка случайных чисел в Microsoft Excel

  2. Вы можете растянуть этот список вниз самостоятельно, создав уникальные числа с определенным шагом увеличения.Растягивание функции суммы для создания списка случайных чисел в Microsoft Excel

  3. Однако, если нужно получить больше 100 единиц в перечне, растягивать его не очень удобно. Можно пойти более простым путем. Сначала скопируйте первое значение.Копирование функции суммы для создания списка случайных чисел в Microsoft Excel

  4. После этого нажмите сочетание клавиш Ctrl + G и в поле «Ссылка» введите номер последней ячейки списка.Переход к последней ячейке для создания списка случайных чисел в Microsoft Excel

  5. Перейдите к ней, зажмите Ctrl + Shift + Стрелка Вверх для выделения всех ячеек до первой.Выделение диапазона ячеек для создания списка случайных чисел в Microsoft Excel

  6. Первое значение у вас уже скопировано, поэтому остается только вставить саму функцию, используя сочетание клавиш Ctrl + V. Теперь у вас в распоряжении есть большой список с неповторяющимися числами.Вставка функции во все ячейки для создания списка случайных чисел в Microsoft Excel

  7. Скопируйте весь перечень, откройте контекстное меню, щелкнув по любой ячейке правой кнопкой мыши, и используйте специальную вставку, чтобы вставить только значения. Так вы удалите функцию суммы, которая больше в списке не нужна.Вставка как значения для создания списка случайных чисел в Microsoft Excel

  8. Выделите любую клетку с числом и убедитесь, что функция отсутствует и осталось только значение.Проверка вставки значений для создания списка случайных чисел в Microsoft Excel

Список с неповторяющимися числами есть, но все они расположены в порядке возрастания. Нужно исправить эту ситуацию, сделав их случайными. В этом поможет инструмент сортировки данных и вспомогательная функция.

  1. Создайте название для текущего списка, а рядом пропишите еще один заголовок.Создание заголовков для списков для создания списка случайных чисел в Microsoft Excel

  2. После этого выделите первую ячейку второго списка и задайте там формулу =СЛЧИС(). Она генерирует случайное нецелое число в ячейке.Объявление функции случайных нецелых чисел для создания списка случайных чисел в Microsoft Excel

  3. Растяните функцию, чтобы она заканчивалась там, где заканчивается последнее число созданного ранее списка.Растягивание списка нецелых чисел для создания списка случайных чисел в Microsoft Excel

  4. Выделите первый заголовок и перейдите на вкладку «Данные».Переход к вкладке Данные для создания списка случайных чисел в Microsoft Excel

  5. Включите функцию «Фильтр».Включение фильтра для создания списка случайных чисел в Microsoft Excel

  6. Теперь нажмите кнопку со стрелкой, расположенную справа от названия списка с нецелыми числами, и выберите один из вариантов сортировки.Использование сортировки для создания списка случайных чисел в Microsoft Excel

  7. Вместе со вторым столбцом отсортирован и первый – все числа в нем не повторяются и являются случайными.Результат сортировки для создания списка случайных чисел в Microsoft Excel

  8. Удалите ненужные вспомогательные элементы, оставив только готовый перечень. Теперь его можно использовать в личных целях.Удаление лишнего для создания списка случайных чисел в Microsoft Excel

Может показаться, что генерирование случайных чисел в Excel занимает много времени. Однако вам понадобится всего пара минут, чтобы ознакомиться с моей инструкцией и реализовать ее самостоятельно. Никаких сложностей и тонкостей нет, поэтому у вас обязательно все получится.

//#include «stdafx.h»
//разкомментировать в Visual Studio

#include <math.h>
#include <stdio.h>
#include <math.h>

bool RepeatDigits(unsigned short int );

int main(){
    unsigned short int /* чтобы знать сколько цифр сравнивать между собой
     в случае ввода максимально большого числа для данного типа..
     в нашем случае 5, т.к Unsigned Short Int  — 0..65535 (5 цифр)*/
        Numbers[5];    
    int        
        x;
    printf(«Enter 5 numbersn»);
    for(int i=0;i<5;i++){   // начинаем вводить данные в промеж. перем.
        while(true){        // а затем заполнять массив
            printf(«%d) «,i+1); //декоративности
            scanf(«%d»,&x); // вводим натуральное число
            if(x<0)
                x = abs(x);   // если не натуральное ввёл.. преподаватели любят искать баги
            if(x<65535 && x>0)// дабы не выйти за пределы ансигнэд шорт инт
                break;
            else
                printf(«Again, pleasen»);
        }
        Numbers = x;     // а только теперь помещаем в массив
    }
    printf(«n»);
    for(int i=0;i<5;i++)
        if( !RepeatDigits(Numbers) ) // Если нет повтора в цифрах то вывод
            printf(«%hu  «,Numbers);
    printf(«n»);
    return 0;
}

bool RepeatDigits(unsigned short int  x){
    bool Repeat = false;
    int
        digits[5], //массив для цифр
        count = 0,
        i,j;
    while(x%10){   // здесь мы рвём число на цифры и заносим в массив
        digits[count] = x%10;
        x /= 10;
        count++;
    }
    for(i=0;i<count;i++) // проверка на повтор
        for(j=i+1;j<count;j++)
            if(digits==digits[j])
                Repeat = true;  
    return Repeat;  //в случае повтора — truе, не_повтора — false
}

Понравилась статья? Поделить с друзьями:
  • Как найти в телефоне документы ватсап
  • Как найти игрока в роблокс по скину
  • Как составить пентапептид
  • Как найти контакты скайпа в компьютере
  • Телевизор сони как найти блютуз