Функция СлучайноеЧисло(НачЧисло = 0,КонЧисло = 1,флЦелое = 0)
ТекВремя =ТекущееВремя();
СлЧисло = 0;
Пока ТекущееВремя() =ТекВремя Цикл
СлЧисло =СлЧисло + 1;
КонецЦикла;
СлЧисло =Число(Прав("000" +СлЧисло, 3)) / 1000;
// число от 0 до 0.999
СлЧисло =НачЧисло + (КонЧисло -НачЧисло) *СлЧисло;
// число от НачЧисло до КонЧисло
Возврат ?флЦелое = 1,Окр(СлЧисло, 0),СлЧисло);
КонецФункции
Получение случайного числа средствами 1С (пример функции)
Разработка - Универсальные функции
См. также
Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)
Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.
21.05.2024 20514 dimanich70 81
Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)
Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.
1 стартмани
18.03.2024 4116 3 John_d 11
Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)
Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.
12.02.2024 18627 atdonya 24
Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)
На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.
30.11.2023 5537 ke.92@mail.ru 16
БСП (Библиотека стандартных подсистем) Сканер штрих-кода Универсальные функции Этикетки, ценники Программист Бизнес-аналитик Конфигурации 1cv8 Бесплатно (free)
Разберем на примерах использование компоненты из БСП для генерации штрихкода и матричных кодов.
15.09.2023 18637 YA_418728146 9
WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)
При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.
28.08.2023 14910 YA_418728146 7
Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)
Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.
2 стартмани
22.08.2023 3621 57 progmaster 8
Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)
Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)
1 стартмани
13.10.2022 18533 171 sapervodichka 112
Функция ПолучитьСлучайноеЧисло(Мин,Макс)
//вместо Randomize
Для н = 1 По 100 Цикл
Уник = Новый УникальныйИдентификатор;
КонецЦикла;
//генерируем GUID
Уник = СокрЛП(Новый УникальныйИдентификатор);
//оставляем только цифры
Уник = СтрЗаменить(Уник,"-","");
Уник = СтрЗаменить(Уник,"a","");
Уник = СтрЗаменить(Уник,"b","");
Уник = СтрЗаменить(Уник,"c","");
Уник = СтрЗаменить(Уник,"d","");
Уник = СтрЗаменить(Уник,"e","");
Уник = СтрЗаменить(Уник,"f","");
//знаменатель должен иметь такое же количество нулей + 1
Знаменатель = 10;
Для н = 2 По (СтрДлина(СтрЗаменить(Уник,Символы.НПП,""))) Цикл
Знаменатель = Знаменатель * 10;
КонецЦикла;
Случ = Число(Уник) / Знаменатель; //здесь получается дробное случайное число от 0 до 1
//преобразуем его в случайное число из заданного интервала, округляем до целого
ЧислоИзИнтервала = Мин(Макс(Окр(Мин + (Макс-Мин)*Случ),Мин),Макс);
Возврат ЧислоИзИнтервала;
КонецФункции
Код |
---|
ГСЧ = Новый ГенераторСлучайныхЧисел(255);
Рэндом = ГСЧ.СлучайноеЧисло(0, 10000);
Показать полностью |
:)
Новый ГенераторСлучайныхЧисел(<НачальноеЧисло>)
Параметры:
<НачальноеЧисло> (необязательный)
Тип: Число.
Начальное число, которым инициализируется генератор случайных чисел.
Описание:
Генератор случайных чисел инициализируется начальным числом из параметра.
Последовательность случайных чисел для одного и того же начального числа будет одинакова.
нужно изменяющееся зерно задавать, например так
ГенераторСлучайныхЧисел = Новый ГенераторСлучайныхЧисел(ТекущаяУниверсальнаяДатаВМиллисекундах());
СлучайноеЧисло = ГенераторСлучайныхЧисел.СлучайноеЧисло(0, 99);
//НВЮ/ Получение Случайного Числа
//
// Параметры
// <Мин> - <Число> - Нижняя граница Равномерного Распределения
// <Макс> - <Число> - Верхняя граница Равномерного Распределения
//
// Возвращаемое значение:
// <Число> - Сгенерированное случайное число
//
Функция ПолучитьСлучайноеЧисло(Мин=0,Макс=100) Экспорт
//вместо Randomize
Для н = 1 По Макс Цикл
Уник = Новый УникальныйИдентификатор;
КонецЦикла;
//генерируем GUID
Уник = СокрЛП(Новый УникальныйИдентификатор);
//оставляем только цифры
Уник = СтрЗаменить(Уник,"-","");
Уник = СтрЗаменить(Уник,Символы.НПП,"");
Случ = 0;
//знаменатель должен иметь такую же разрядность
Знаменатель = 1;
Для н = 1 По (СтрДлина(Уник)) Цикл
ТекС = Сред(Уник,н,1);
Если ТекС="a" Тогда
Случ = Случ + Знаменатель*10;
ИначеЕсли ТекС="b" Тогда
Случ = Случ + Знаменатель*11;
ИначеЕсли ТекС="c" Тогда
Случ = Случ + Знаменатель*12;
ИначеЕсли ТекС="d" Тогда
Случ = Случ + Знаменатель*13;
ИначеЕсли ТекС="e" Тогда
Случ = Случ + Знаменатель*14;
ИначеЕсли ТекС="f" Тогда
Случ = Случ + Знаменатель*15;
ИначеЕсли ТекС="1" Тогда
Случ = Случ + Знаменатель;
ИначеЕсли ТекС="2" Тогда
Случ = Случ + Знаменатель*2;
ИначеЕсли ТекС="3" Тогда
Случ = Случ + Знаменатель*3;
ИначеЕсли ТекС="4" Тогда
Случ = Случ + Знаменатель*4;
ИначеЕсли ТекС="5" Тогда
Случ = Случ + Знаменатель*5;
ИначеЕсли ТекС="6" Тогда
Случ = Случ + Знаменатель*6;
ИначеЕсли ТекС="7" Тогда
Случ = Случ + Знаменатель*7;
ИначеЕсли ТекС="8" Тогда
Случ = Случ + Знаменатель*8;
ИначеЕсли ТекС="9" Тогда
Случ = Случ + Знаменатель*9;
КонецЕсли;
Знаменатель = Знаменатель * 16;
КонецЦикла;
Случ = Случ / Знаменатель; //здесь получается дробное случайное число от 0 до 1
//преобразуем его в случайное число из заданного интервала, округляем до целого
ЧислоИзИнтервала = Мин(Макс(Окр(Мин + (Макс-Мин)*Случ),Мин),Макс);
Возврат ЧислоИзИнтервала;
КонецФункции //ПолучитьСлучайноеЧисло()
Показать//НВЮ/ Получение Случайного Числа
//
// Параметры
// <Мин> - <Число> - Нижняя граница Равномерного Распределения
// <Макс> - <Число> - Верхняя граница Равномерного Распределения
//
// Возвращаемое значение:
// <Число> - Сгенерированное случайное число
//
Функция ПолучитьСлучайноеЧисло(Мин=0,Макс=100) Экспорт
//вместо Randomize
Для н = 1 По Макс Цикл
Уник = Новый УникальныйИдентификатор;
КонецЦикла;
//генерируем GUID
Уник = СокрЛП(Новый УникальныйИдентификатор);
//оставляем только цифры
Уник = СтрЗаменить(Уник,"-","");
Уник = СтрЗаменить(Уник,Символы.НПП,"");
Случ = 0;
//знаменатель должен иметь такую же разрядность
Знаменатель = 1;
Для н = 1 По (СтрДлина(Уник)) Цикл
ТекС = Сред(Уник,н,1);
Если ТекС="a" Тогда
Случ = Случ + Знаменатель*10;
ИначеЕсли ТекС="b" Тогда
Случ = Случ + Знаменатель*11;
ИначеЕсли ТекС="c" Тогда
Случ = Случ + Знаменатель*12;
ИначеЕсли ТекС="d" Тогда
Случ = Случ + Знаменатель*13;
ИначеЕсли ТекС="e" Тогда
Случ = Случ + Знаменатель*14;
ИначеЕсли ТекС="f" Тогда
Случ = Случ + Знаменатель*15;
ИначеЕсли ТекС="1" Тогда
Случ = Случ + Знаменатель;
ИначеЕсли ТекС="2" Тогда
Случ = Случ + Знаменатель*2;
ИначеЕсли ТекС="3" Тогда
Случ = Случ + Знаменатель*3;
ИначеЕсли ТекС="4" Тогда
Случ = Случ + Знаменатель*4;
ИначеЕсли ТекС="5" Тогда
Случ = Случ + Знаменатель*5;
ИначеЕсли ТекС="6" Тогда
Случ = Случ + Знаменатель*6;
ИначеЕсли ТекС="7" Тогда
Случ = Случ + Знаменатель*7;
ИначеЕсли ТекС="8" Тогда
Случ = Случ + Знаменатель*8;
ИначеЕсли ТекС="9" Тогда
Случ = Случ + Знаменатель*9;
КонецЕсли;
Знаменатель = Знаменатель * 16;
КонецЦикла;
Случ = Случ / Знаменатель; //здесь получается дробное случайное число от 0 до 1
//преобразуем его в случайное число из заданного интервала, округляем до целого
ЧислоИзИнтервала = Мин(Макс(Окр(Мин + (Макс-Мин)*Случ),Мин),Макс);
Возврат ЧислоИзИнтервала;
КонецФункции //ПолучитьСлучайноеЧисло()
Показать&НаКлиенте
Процедура ВамПредлогаетКомпьютерПриИзменении(Элемент)
Результат = ПолучитьСлучайноеЧисло(Мин,Макс, Элемент);
Сообщить (Результат);
КонецПроцедуры
Выдает ошибку, к преобразованию значения типу Число не может быть выполнено
{ВнешняяОбработка.ВнешняяОбработка1.Форма.БыкиИКоровыФорма.Форма(30)}: Преобразование значения к типу Число не может быть выполнено
ЧислоИзИнтервала = Мин(Макс(Окр(Мин + (Макс-Мин)*Случ),Мин),Макс);
Help please
Код |
---|
//////////////////////////
// ГЕНЕРАТОР СЛУЧАЙНЫХ ЧИСЕЛ
// Автор Сергей Нефедов
//////////////////////////
Процедура randomize(а=0)
// сбрасывает генератор
Если а=0 тогда
randSeed=_getPerformanceCounter();
Иначе
randseed=а;
КонецЕсли;
КонецПроцедуры
Функция random()
// выдает случайное число 0 <= rand < 1
// интерпретация интерпритации AVB
// выдает последовательности лучше, и работает быстрее.
// (не замедляется)
// дело в том, что у него возникают очень большие числа,
// а 1С некокорректно с ними работает (операция %)
randSeed=(randSeed*1103515245+12345)%2147483648;
возврат randSeed/2147483648;
КонецФункции
Показать полностью |
Я долго искал возможность создания генератора случайных чисел в 1С7.7 и вот свершилось. Разброс чисел по оценке - отлично. Используется средствами VBScript
//Глобальный модуль
Функция _СлучайноеЧислоVBA(VBA, N, ВыдаватьНоль = 0) Экспорт
Если ВыдаватьНоль = 0 Тогда
N = N + 1;
КонецЕсли;
VBA.Language = "VBscript";
VBA.AddCode("
|Function GetRND(x)
|R = Int(0 + (Rnd() * x))
|GetRND = R
|End Function
|");
Результат=VBA.Modules("Global").CodeObject.GetRND(N);
Если Результат = 0 Тогда
Если ВыдаватьНоль = 0 Тогда
Результат = 1;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Показать//Где-то в модуле формы
Процедура ПриОткрытии()
VBA = СоздатьОбъект("MSScriptControl.ScriptControl");
ДоЧисла = 3;
ВыдаватьНоль = 0;
Для Ц = 1 По 100 Цикл
Ранд = _СлучайноеЧислоVBA(VBA, ДоЧисла, ВыдаватьНоль);
Сообщить(Ранд);
КонецЦикла;
КонецПроцедуры
ПоказатьПеред вызовом Rnd для инициализации генератора случайных чисел с начальным значением на основе системного таймера воспользуйтесь оператором Randomize без указания аргументов.
Код можно переписать так (будет генерить целые от 1 до 100):
Функция СлучайноеЧислоVBA(N)
VBA = СоздатьОбъект("MSScriptControl.ScriptControl");
VBA.Language = "VBscript";
VBA.AddCode("
|Function GetRND(x)
|Randomize
|R = Int(1 (Rnd() * x))
|GetRND = R
|End Function
|");
Возврат VBA.Modules("Global").CodeObject.GetRND(N);
КонецФункции
Процедура Тест()
Для Ц = 1 По 100 Цикл
Ранд = СлучайноеЧислоVBA(100);
Сообщить(Ранд);
КонецЦикла;
КонецПроцедуры
ПоказатьГСЧ = Новый ГенераторСлучайныхЧисел;
СлучЧисло = ГСЧ.СлучайноеЧисло(НецелоеЧисло1*100, НецелоеЧисло2*100);
СлучЧисло=Окр(СлучЧисло/100,2);
_tmp=СоздатьОбъект("MSScriptControl.ScriptControl");
_tmp.language="javascript";
_rand= Цел(_tmp.eval("Math.random()")*100);
Сообщить(_rand);
Вставлять в глобальный модуль
ЗЫЖ 7.7
Функция ПолучитьСлучайноеЧисло(МаксЗН,ВыдаватьНоль = 0) Экспорт Далее
//**********************************************************************
Функция ПолучитьСлучайноеЧисло(МаксЗН,ВыдаватьНоль = 0) Экспорт
//Увеличиваем на единицу, т.к. функция не возвращает верхний порог
МаксЗН = МаксЗН + 1;
Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Результат= Цел(Скрипт.eval("Math.random()")*МаксЗН);
Если (ВыдаватьНоль = 0) и (Результат = 0) Тогда
Пока Результат = 0 Цикл
Результат = ПолучитьСлучайноеЧисло(МаксЗН,0)
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
ПоказатьГСЧ = Новый ГенераторСлучайныхЧисел();
Рэндом = ГСЧ.СлучайноеЧисло(0, 10000);
Описано в документации
Было:
Для объекта ГенераторСлучайныхЧисел использовался алгоритм Вихрь Мерсенна.
Стало:
Для объекта ГенераторСлучайныхЧисел используется генератор случайных чисел в соответствие со стандартом NIST SP 800-90A (алгоритм Hash_DRBG). Последовательность чисел, которая получается при создании двух разных объектов генератора случайных чисел с использованием одного и того же начального числа, будет различной.
Источник:
Генератор псевдослучайных чисел, то есть устройство, которое выдает последовательность чисел, отвечающую определенным статистическим критериям случайности.
Например можно воспользоватся классов из Win (mscorlib.dll):
Rnd = СоздатьОбъект("System.Random");
Сообщить(Rnd.Next());
В цикле за единицу времени множество итераций, поэтому генератор выдаст одинаковое число.
Проще и надежнее:
УИД = Новый УникальныйИдентификатор;
ГСЧ = Новый ГенераторСлучайныхЧисел(КодСимвола(Лев(УИД,5)) + КодСимвола(Лев(УИД,4)));
//Получить случайное число в заданном диапазоне
//Примеры:
// СлучайноеЧисло(0, 100) // случайное целое число от 0 до 100
// СлучайноеЧисло(0, 100, 2) // случайное число от 0,00 до 100,00
// СлучайноеЧисло(0, 1, 3) // случайное число от 0,000 до 1,000
Функция СлучайноеЧисло(Мин, Макс, Разрядов = 0) Экспорт
Коэффициент = POW(10, Разрядов);
ГСЧ = Новый ГенераторСлучайныхЧисел();
СЧ = ГСЧ.СлучайноеЧисло(Мин * Коэффициент, Макс * Коэффициент) / Коэффициент;
Возврат СЧ
КонецФункции
ПоказатьДля получения уведомлений о новых публикациях автора подключите телеграм бот: Инфостарт бот
№ 57305
Создание 03.10.08 06:26
Обновление 03.10.08 06:26
Просмотры 70072
Загрузки 0
Рейтинг
18
Комментарии 27
Код открыт Не указано
Рубрики Универсальные функции
Кому Программист
Тип файла Нет файла
Платформа Не имеет значения
Конфигурация Не имеет значения
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)