Генератор случайных чисел/символов

28.10.16

Разработка - Универсальные функции

Для 1С:Предприятие 8.2.17(и выше) или 8.3

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
RandomNumberGenerator
.epf 6,34Kb
6 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

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

Процедура КнопкаСгенерировать()    
    Для Сч = 1 по 100 Цикл
        Сообщить(ГенерацияСлучайногоСимвола(ТекущаяУниверсальнаяДатаВМиллисекундах()));
    КонецЦикла;   
КонецПроцедуры

Функция ГенерацияСлучайногоСимвола(Счетчик)
    ГСЧ = Новый ГенераторСлучайныхЧисел(Счетчик);    
    СлучайнаяСтрока = "";
    // генерируем случайное число из 6-ти символов, например "d0c8Yf"
    Для Сч = 1 по 6 Цикл        
        Набор = ГСЧ.СлучайноеЧисло(1,3);    
        Если Набор = 1 Тогда
            // это число
            СлучайныйСимвол = ГСЧ.СлучайноеЧисло(0,9);    
        ИначеЕсли Набор = 2 Тогда
            // это Большая буква латиницы
            СлучайныйСимвол = Символ(ГСЧ.СлучайноеЧисло(65,90));
        ИначеЕсли Набор = 3 Тогда
            // это маленькая буква латиницы
            СлучайныйСимвол = Символ(ГСЧ.СлучайноеЧисло(97,122));
        КонецЕсли;
        СлучайнаяСтрока = СлучайнаяСтрока + СлучайныйСимвол;
    КонецЦикла;      
    Возврат(СлучайнаяСтрока);    
КонецФункции

!Особенность.Если ТекущаяУниверсальнаяДатаВМиллисекундах() вернет 2 и более одинаковых числа (т.е. сервер настолько быстрый, что 2 и более операции произошли в рамках 1 миллисекунды), будут сгенерированы 2 и более одинаковых "случайных числа".

Для меня уникальность значений очень критична, поэтому я сохраняю все сгенерированные случайные числа в регистр сведений и после генерирования нового случайного числа проверяю его на наличие в регистре сведений  (естественно, 99,9999% его там нет). Но если вдруг произойдет совпадение, генерирую новое случайное число и снова проверяю на наличие в регистре.

Вступайте в нашу телеграмм-группу Инфостарт

Генератор случайных чисел ГСЧ

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4750    Abysswalker    11    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    8903    DeerCven    15    

63

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    57508    dimanich70    85    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    8089    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    72172    atdonya    31    

73

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    10065    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Pasha1st 865 28.10.16 08:05 Сейчас в теме
Почему-то многие забывают о такой вещи, что если строка предназначена для человека (это генератор паролей, например), то не стоит допускать одновременного появления в пароле визуально схожих символов - 0 и O, 1, l и I. Их требуется или полностью исключить, или оставить только какой-то однозначный вариант, например только цифры. А ещё можно сделать управление вероятностью появления символа из конкретного набора (больше-меньше цифр).
okabysh; dj_serega; +2 Ответить
2. okabysh 9 29.10.16 20:05 Сейчас в теме
(1) Pasha1st,
Приветствую, Павел.
Спасибо за комментарий.
Если использовать для генерации паролей пользователю, тогда очень желательно убрать генерацию символов, которые могут быть похожи друг на друга. Я обновлю данную обработку с Вашим пожеланием, вдруг и мне позже пригодится.
Лично я использовал для добавления данного идентификатора в назначение платежа. Не буду вдаваться в подробности, но эти символы обрабатывает компьютер как с одной так и с другой стороны, поэтому компьютер точно поймет какой символ пришел к нему)
3. Alias 177 31.10.16 10:11 Сейчас в теме
(2) "Для меня уникальность значений очень критична, поэтому я сохраняю все сгенерированные случайные числа в регистр сведений"
А если не секрет, почему именно такой, не самый оптимальный с моей точки зрения, путь выбран? Это же хранить все выданные последовательности, да ещё и постоянно проверять уникальность...
Скажите, разве не проще было сделать самый обычный инкрементальный счётчик, хоть в той же константе? Никаких регистров, никаких проверок... Сплошные плюсы! Знай себе +1 делай и всё.
А если очень хочется иметь именно 6-тисимвольный код, можно преобразовать значение полученного счётчика в символьную последовательность, -- алгоритм абсолютно аналогичен переводу в другую систему счисления. Бонусом имеем ещё и отслеживаемую хронологию...
М-м?
4. okabysh 9 02.11.16 01:15 Сейчас в теме
(3) Александр, спасибо за комментарий.
ответ на: "А если не секрет, почему именно такой, не самый оптимальный с моей точки зрения, путь выбран? Это же хранить все выданные последовательности, да ещё и постоянно проверять уникальность...".
Дело в том, что мне нужно знать, какому объекту я выдал в моем случае 6-ти значный код, поэтому я храню данные в регистре по 2-м измерениям: ссылку на объект и 6-ти значный код с типом "Строка". Когда потребуется найти объект, я его всегда найду, зная 6ть символов кода. В моем случае требовалось использовать минимум символов для кодирования, но чтобы их было нельзя подобрать, поэтому я не мог брать простой счетчик, к примеру, от 100000 + 1, +1, +1 ...
Еще можно использовать GUID, тогда уникальность практически на 100% гарантируется, но коду требуется уже 36 символов. Повторюсь, в моей ситуации 36 символов это много и следовательно не подходит. Поэтому я сделал, как сделал)

Основная цель публикации:
показать на "пальцах" как использовать ГенераторСлучайныхЧисел() и его особенность.
Так что пусть каждый реализует свою логику как считает нужным.
5. Alias 177 02.11.16 09:58 Сейчас в теме
(4) Ясно, спасибо за уточнение. "...Чтобы их было нельзя подобрать..." -- это ключевая фраза. Да, в таком случае автоинкрементируемый счётчик не очень подходит -- он слишком легко прогнозируем (что в других случаях могло бы быть плюсом).
6. vika64 75 21.05.20 22:13 Сейчас в теме
спасибо большое, сэкономили кучу времени!!
7. nuctoh 31 24.11.20 17:28 Сейчас в теме
БОЖЕЧКИ ЧТО ЗА ДИЧЬ?!
Чтобы в цикле на каждой итерации получать случайное число генератором случайных чисел, то всего лишь достаточно инициализировать его один раз вне цикла, и дальше вызывать ГСЧ.СлучайноеЧисло() столько раз, сколько захочется - 1Совский генератор выдает достаточно ровно распределенный рандом. Погоня автора за гарантированно уникальными значениями случайных чисел - это вообще лютый трэш и попрание самого принципа случайности, особенно при генерации пароля, т.к. с увеличением длины пароля рост числа комбинаций замедляется.
А если уж так хочется гарантировать случайность последовательности, боясь нескольких инициализаций ГСЧ в одну секунду системного времени, то можно создать общий модуль ПовтИсп на время сеанса и поместить туда функцию, возвращающую новый ГСЧ
Для отправки сообщения требуется регистрация/авторизация