Modber Сообщество
профессионалов по 1С

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



Платформы: 1С:Предприятие 8.3, 1С:Предприятие 8.2, 1С:Предприятие 8.1
Конфигурации: Все конфигурации
2013-07-11
5411 
Tat
1  

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


1.1. Простой вариант:

Функция СлучайныйГенератор()
    Если emptyvalue(генератор) = 1 Тогда
        генератор = _getperformancecounter();
    КонецЕсли;
    генератор = (с + a * генератор) % m;
    Возврат генератор;
КонецФункции

Здесь рекомендуемые коэффициенты — c = 1013904223, a = 1664525, m = 4294967296 (== 2 ^ 32).
 

1.2. Как сделать, чтобы числа выбирались произвольно от 1 до 100?

СлучайныйГенератор = _GetPerformanceCounter() % (101);
 

1.3. С использованием объекта System.Random:

СлучайныйГенератор = СоздатьОбъект("System.Random");
 

1.4. С использованием VBscript:

Sc = CreateObject("MSScriptControl.ScriptControl");
Sc.language = "VBscript";
sc.executeStatement("randomize");
рнд = Sc.eval("rnd");

 

 

Вычисление уникальной комбинации символов по числу (номеру комбинации в лексикографическом порядке комбинаций) с использованием системы счисления с соответствующим основанием равным числу различных символов

Функция Комбинация(Поз, ТекСимв=1, СимСтр="")
    Если ТекСимв<к Тогда
        Делитель=Степень(СтрДлина(Буквы),к-ТекСимв);
        ТекОст=Поз%Делитель;
        СимСтр=Строка(СимСтр)+Сред(Буквы,Цел(Поз/Делитель+?(ТекОст>0,1,0)),1);    
        Комбинация(ТекОст,ТекСимв+1,СимСтр);
        Возврат СимСтр;
    Иначе          
        СимСтр=СимСтр+Сред(Буквы,(?(Поз=0,СтрДлина(Буквы),Поз)),1);
        Возврат СимСтр;
    КонецЕсли;
КонецФункции

Здесь Поз — номер комбинации (возможно, случайный), ТекСимв — текущий обрабатываемый символ, СимСтр — результирующая строка символов, Буквы = строка, содержащая буквы алфавита в стандартном порядке ("абв...юя"), к — число символов в искомом слове (в данном случае = 6).


 

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

Функция НомерКомбинации(Слово,ТекСимв=0,Поз=0)
    НомСимв=Найти(Буквы,Сред(Слово,к-ТекСимв,1));
    Если ТекСимв>0 Тогда
        Если ТекСимв<к Тогда
            Поз=Поз+(НомСимв-1)*Степень(СтрДлина(Буквы),ТекСимв);
            НомерКомбинации(Слово,ТекСимв+1,Поз);
        Иначе
            Возврат Поз;
        КонецЕсли;
    Иначе
        Поз=?(НомСимв=СтрДлина(Буквы),0,НомСимв);
        НомерКомбинации(Слово,ТекСимв+1,Поз);
        Возврат Поз;
    КонецЕсли;
КонецФункции 

Здесь Слово — комбинация символов, номер которой ищем, ТекСимв — текущий обрабатываемый символ (по сути разряд "числа"), Поз — искомый номер комбинации.


Для задач 2 и 3 также понадобится функция возведения в целочисленную положительную степень:

Функция Степень(Знач а, Знач б, Рез=1)
    Если б>0 Тогда
        Рез=Рез*а;
        б=б-1;
        Степень(а,б,Рез);
        Возврат Рез;
    Иначе
        Возврат Рез;
    КонецЕсли;
КонецФункции

Здесь а — основание степени, б — показатель степени, Рез – результат.


 

Случайно перемешать N чисел

Для i = 1 по N цикл
    массив[i] = i;
Конеццикла;
Для i = 1 по N — 1 цикл 
   Сл = Случ(i, N);
   К = массив[i]; 
   массив[i] = массив[Сл]; 
   массив[Сл] = К;
КонецЦикла;




Бесплатная юридическая
консультация по телефону

8 (499) 350-80-26(Москва)
8 (812) 627-15-62(Спб)

звонок бесплатный

В центре внимания

Комментарии (0)