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

Обновлено: 06.07.2024

Вся проблема в том, что ГенераторСлучайныхЧисел на производительных компьютерах так быстро генерит число, что получается много дубликатов даже в больших числах в конце интервала. Что я имею в виду? Например, мне необходимо было сгенерировать случайным образом 10-ти значные ИНН пусть 20 штук, сделал так:

5555333333
3333333333
3333333333
3333333333
3444444444
4444444444
4999999999
9999999999
9555555555
5555555555
2222222222
2222222222
6666666666
6666666666
2222222222
2222222222
3333333333
3333333333
1111111111
1111111115

8043056388
9102338554
6249282932
1198388359
0526412897
7009103148
0571174217
8993611720
3929803898
7864312503
9471210028
0252270828
4561671060
9351136286
3376451113
7216940055
4858606383
3378262630
6057792110
0900779364

Может, кому-то поможет!

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

Я бы по привычке (с 7.7 начинал) пошел бы списком значений, Отсюда вопрос. Массив быстрее работает чтоли?

И вашем случае я бы чуток по другому сделал

Лучше использовать соответствие. Он индексируется по умолчанию и работает быстрее (ощутите разницу на больших генерациях).
А в целом статья на статью не оч.тянет честно говоря.

(3) Выше уже дали правильный ответ. Ни каких массивов, списков значений, соответствий и прочей лабуды не нужно. Нужно просто вынести инициализацию за пределы цикла.

Подробнее, почему у автора так происходит.

У вас инициализация происходит прямо в цикле. За счёт того, что генерация происходит очень быстро, значение ТекущаяУниверсальнаяДатаВМиллисекундах() на следующей итерации такое же как и на предыдущей и получается та же самая последовательность псевдослучайных чисел.
А совет автора из разряда вредных.

Автор, Вам уже указали в чём ошибка. Рекомендую воспользоваться информацией и описать это как "типичную ошибку новичка", или как-то так. Иначе - не вижу смысла плюсовать.
Если уж нужно проверять на отсутствие дублей - используйте соответствие, будет быстрее.
И ещё: если количество вариантов будет меньше, чем диапазон чисел (например, надо 20 вариантов целого числа от 0 до 9), то подобная процедура приведёт к зацикливанию.

Поскольку в задаче ИНН, то он как минимум будет храниться где-то? не проще ли считать следующий на основе предыдущего?

(8) Если включить его в цикле, со временем он перестанет выдавать случайные числа и зациклится на одинаковых.

(8) Чтобы не быть голословным, я провёл визуальный эксперимент:
У нас есть внешняя обработка, на форме которой находится табличный документ. При открытии формы делаем ячейки квадратными с помощью


и подключаем обработчик ожидания, который выдаёт координаты случайной ячейки табличного документа, а затем окрашивает её в случайный цвет. Я сделал это вот так:

Я попробовал два варианта: в одном из них ГСЧ создаётся при открытии формы, а в другом в начале процедуры СлучайныеКоординаты(). Что должно получиться с табличным документом через несколько минут?

Нечто подобное. Такой результат получается если использовать стандартный ГСЧ, или тот что представлен в комментарии (2). Это получается вне зависимости от того, создаём мы генератор при открытии формы, или же каждый раз создаём его при необходимости сгенерировать случайное число. Он привязан к текущей универсальной дате, поэтому я не беспокоюсь об уникальности, ведь он вызывается не чаще 10 раз в секунду. Самое интересное происходит со временем. Вот результат стандартного ГСЧ, который создавался каждый раз при необходимости сгенерировать случайно число, он сдался быстрее всех:

Это тоже стандартный, но генератор был создан единожды при открытии формы. Он продержался дольше

Ниже представлен результат работы ГСЧ из второго комментария, который создавался каждый раз при необходимости получить случайное число. ПРодержался значительно дольше двух предыдущих

И наконец, ГСЧ из второго комментария, который был создан при открытии формы. Продержался дольше всех


Но на этом не заканчиваются фокусы. Когда ломается генератор, ломается интерфейс. Не только платформы, но и винды (во всяком случае семёрки):

1. Слетают шрифты в панели с подсистемами. Картинки в ней исчезают.
2. В открытой обработке появились кнопки из открытого документа, причём кривые.
3. В то время как открыта обработка, активна вкладка документа, но работать мы можем с обработкой.
4. Ломается кнопка "Пуск".

Интересно, почему всё серое? Диапазон цветов состоит из трёх значений, каждое из которых может быть равно числу от 0 до 255, т.е. всего 256 значений. Серый цвет -- это самый усреднённый цвет. Его значение равно 128, 128, 128 (3 раза 256/2). Единственное чего я не понимаю так это почему он стабильно выдаёт среднее значение от 0 до 255, но закрашивает клетки не по диагонали, или не в одном месте.

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

Создайте уникальное случайное число с помощью Kutools for Excel's Вставить случайные данные (легко!)

Создавайте уникальные случайные числа с помощью формул

Чтобы сгенерировать уникальные случайные числа в Excel, вам нужно использовать две формулы.

doc-randomize-no-repeat-1

1. Предположим, вам нужно сгенерировать случайные числа без дубликатов в столбце A и столбце B, теперь выберите ячейку E1 и введите эту формулу = СЛЧИС () , Затем нажмите Enter ключ, см. снимок экрана:

doc-randomize-no-repeat-2

2. И выберите весь столбец E, нажав Ctrl + Space одновременно, а затем нажмите Ctrl + D ключи для применения формулы = СЛЧИС () ко всей колонке E. См. снимок экрана:

doc-randomize-no-repeat-3

3. Затем в ячейке D1 введите максимальное количество необходимого случайного числа. В этом случае я хочу вставить случайные числа без повторения от 1 до 50, поэтому я введу 50 в D1.

doc-randomize-no-repeat-4

4. Теперь перейдите к столбцу A, выберите ячейку A1, введите эту формулу. =IF(ROW()-ROW(A$1)+1>$D$1/2,"",RANK(OFFSET($E$1,ROW()-ROW(A$1)+(COLUMN()-COLUMN($A1))*($D$1/2),),$E$1:INDEX($E$1:$E$1000,$D$1))) , затем перетащите маркер заполнения в следующий столбец B и перетащите маркер заполнения в нужный диапазон. Смотрите скриншот:

Теперь в этом диапазоне нужные вам случайные числа не повторяются.

Примечание:

1. В приведенной выше длинной формуле A1 указывает ячейку, в которой используется длинная формула, D1 указывает максимальное количество случайных чисел, E1 - первая ячейка столбца, в котором применяется формула = RAND (), а 2 означает, что вы хотите вставить случайное число в два столбца. Вы можете изменить их по своему усмотрению.

2. Когда все уникальные числа сгенерированы в диапазоне, избыточные ячейки будут показаны как пустые.

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

Генерация уникального случайного числа с помощью Kutools for Excel's Вставить случайные данные

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

Меньше времени, но выше производительность

Включает более 300 профессиональных инструментов для Excel 2019-2003
Первая версия 1.0 была выпущена в 2011 году, сейчас это версия 18.0.
Решает большинство ежедневных сложных задач Excel за секунды, экономя ваше время
30-дневная бесплатная пробная версия без каких-либо ограничений
Бесплатная загрузка Детали функции

После установки Kutools for Excel, сделайте следующее: (Бесплатная загрузка Kutools for Excel прямо сейчас!)


1. Выберите диапазон, необходимый для генерации случайных чисел, и нажмите Кутулс > Вставить > Вставить случайные данные. Смотрите скриншот:


2. в Вставить случайные данные диалога, перейдите к Целое на вкладке введите нужный диапазон номеров в от и к текстовые поля и не забудьте проверить Уникальные ценности вариант. Смотрите скриншот:


3. Нажмите Ok для генерации случайных чисел и выхода из диалогового окна.

Примечание:Если количество выбранных вами ячеек превышает случайные числа, избыточные ячейки отображаются как пустые.

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

Наконечник.Если вы хотите выбрать или отсортировать данные случайным образом, попробуйте использовать Kutools for Excel's Сортировка диапазона случайным образом как показано на следующем снимке экрана. Полная функция без ограничений в течение 30 дней, пожалуйста, скачайте и получите бесплатную пробную версию сейчас.

модуль random

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

Содержание

Список методов модуля random в Python:

МетодОписание
seed()Инициализация генератора случайных чисел
getstate()Возвращает текущее внутренне состояние (state) генератора случайных чисел
setstate()Восстанавливает внутреннее состояние (state) генератора случайных чисел
getrandbits()Возвращает число, которое представляет собой случайные биты
randrange()Возвращает случайное число в пределах заданного промежутка
randint()Возвращает случайное число в пределах заданного промежутка
choice()Возвращает случайный элемент заданной последовательности
choices()Возвращает список со случайной выборкой из заданной последовательности
shuffle()Берет последовательность и возвращает ее в перемешанном состоянии
sample()Возвращает заданную выборку последовательности
random()Возвращает случайное вещественное число в промежутке от 0 до 1
uniform()Возвращает случайное вещественное число в указанном промежутке
triangular()Возвращает случайное вещественное число в промежутке между двумя заданными параметрами. Также можно использовать параметр mode для уточнения середины между указанными параметрами
betavariate()Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на Бета-распределении, которое используется в статистике
expovariate()Возвращает случайное вещественное число в промежутке между 0 и 1, или же между 0 и -1 , когда параметр отрицательный. За основу берется Экспоненциальное распределение, которое используется в статистике
gammavariate()Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на Гамма-распределении, которое используется в статистике
gauss()Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на Гауссовом распределении, которое используется в теории вероятности
lognormvariate()Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на Логнормальном распределении, которое используется в теории вероятности
normalvariate()Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на Нормальном распределении, которое используется в теории вероятности
vonmisesvariate()Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на распределении фон Мизеса, которое используется в направленной статистике
paretovariate()Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на распределении Парето, которое используется в теории вероятности
weibullvariate()Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на распределении Вейбулла, которое используется в статистике

Цели данной статьи

Далее представлен список основных операций, которые будут описаны в руководстве:

  • Генерация случайных чисел для различных распределений, которые включают целые и вещественные числа с плавающей запятой;
  • Случайная выборка нескольких элементов последовательности population ;
  • Функции модуля random;
  • Перемешивание элементов последовательности. Seed в генераторе случайных данных;
  • Генерация случайных строки и паролей;
  • Криптографическое обеспечение безопасности генератора случайных данных при помощи использования модуля secrets. Обеспечение безопасности токенов, ключей безопасности и URL;
  • Способ настройки работы генератора случайных данных;
  • Использование numpy.random для генерации случайных массивов;
  • Использование модуля UUID для генерации уникальных ID.

В статье также даются ссылки на некоторые другие тексты сайта, связанные с рассматриваемой темой.

Как использовать модуль random в Python

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

$existing_array = [] while( (in_array( $new_number1 = random_int(0,9)), $existing_array ) ); array_push($existing_array, $new_number); while( (in_array( $new_number2 = random_int(0,9)), $existing_array ) ); array_push($existing_array, $new_number); while( (in_array( $new_number3 = random_int(0,9)), $existing_array ) ); array_push($existing_array, $new_number);

В результате получится три переменные $new_number1, $new_number2 , $new_number3, со значениями от 0 до 9 без повторов.

Если нужно сгенерировать большое количество случайных чисел нужно воспользоваться циклом for

Допустим, нужно десять случайных чисел от 0 до 20 без повторов.

$existing = [] for ($i = 0; $i while( (in_array( $number = random_int(0,20)), $existing ) ); array_push($existing_array, $new_number); > ?>

Все эти числа хранятся в массиве $existing

Чтобы получить их нужно выполнить ещё один цикл

for ($i = 0; $i echo $existing[$i]; echo '
';

Результат работы такого генератора вы можете увидеть ниже - обновите страницу (F5 или CTRL + F5) чтобы повторить генерацию и убедиться, что повторов нет.

Читайте также: