7.7 Случайный алгоритм

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем Peroman, 20 окт 2010.

  1. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    879
    Симпатии:
    13
    Баллы:
    29
    Нужно перенести данные справочников между идентичными базами.
    Но нужно чтобы перенеслась малая часть данных, причем чтобы при переносе в каждом справочнике выдиралось разное количество элементов. Может есть как в других языках программирования метод случайного алгоритма?
    Для чего это нужно:
    Работаю над переносом данных, из семерки в восьмерку и при перносе выгрузка загрузка проходит очень долго, а настраивать приходится порой незначительные параметры и всё по новой.
    Так вот если справочники будут с малым содержанием, процесс ускорится.
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Проще всего так:
    Код:
    Перем Зн; 
    
    Процедура Randomize() 
    Перем ч,м,с;
    ТекущееВремя(ч,м,с);
    Зн=ч*24+м*60+с;
    КонецПроцедуры  
    
    Функция Random(н) Экспорт
    Зн=(13*Зн+13849)%65536;
    Возврат ((Зн%н)+1);
    КонецФункции
    
    
    
  3. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    879
    Симпатии:
    13
    Баллы:
    29
    Если откровенно не фига не понял как это работает.
    Например откуда функция берет значение переменной "н"?
    А в в процедуре вообще значение получается в тысячах- а мне надо примерно 15- 30 элементов выдрать.
  4. poiuy
    Offline

    poiuy Опытный в 1С

    Регистрация:
    12 окт 2010
    Сообщения:
    170
    Симпатии:
    0
    Баллы:
    26
    Просто не все скопипастили :)

    Оригинал типа :)

    Код:
    Перем RandSeed;
    Процедура Randomize() 
    Перем h,m,s;
    ТекущееВремя(h,m,s);
    RandSeed=h*24+m*60+s;
    КонецПроцедуры
    Функция Random(n) Экспорт
    RandSeed=(13*RandSeed+13849)%65536;
    Возврат ((RandSeed%n)+1);
    КонецФункции
    Процедура Сформировать()
    Randomize();
    Для нс=1 по 20 Цикл
    сообщить(Random(10));
    КонецЦикла;
    КонецПроцедуры
    
    
    Или еще вариант:
    Код:
    Ранд=_GetPerformanceCounter()%(х+1); //х – предел значения случайного числа от 0 до х;
    
    <сообщил Bozgalev>


    Вот, имхо, очень качественный алгоритм от комитета ANSI-C
    перевод на 1с мой :)
    работает правда медленнее чуть-чуть, чем те, что выше, зато последовательности выдает просто замечательные.
    _getPerformanceCounter() для совместимости с "1С:Совместимо" можно заменить на то, что выше.
    Код:
    var randSeed export;
    // **************
    function randomize() export
    randSeed=_getPerformanceCounter();
    endFunction
    // **************
    function random(n) export
    randSeed=randSeed*1103515245+12345;
    return ((randSeed/65536)%32768)%n+1;
    endFunction 
    
    
    <сообщил avb>

    И ещё один алгоритм:
    Перем GlSeed;
    Код:
    //------------------------------
    //Алгоритм 133a (Алгоритмы выпуск №4 под редакцией Агеева. Вычислительный центр АН СССР. 1967)
    Функция СлучайноеЧисло(N)
    m35=34359738368;
    m36=68719476736;
    m37=137438953472;
    GlSeed=5*GlSeed;
    Если GlSeed>=m37 Тогда GlSeed=GlSeed-m37 КонецЕсли;
    Если GlSeed>=m36 Тогда GlSeed=GlSeed-m36 КонецЕсли;
    Если GlSeed>=m35 Тогда GlSeed=GlSeed-m35 КонецЕсли;
    Возврат Цел(GlSeed/m35*N)+1;
    КонецФункции 
    
    
    <сообщил Soaron>

    Все это отсель http://www.sinor.ru/~my1c/knowhow/rand.html
  5. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Раз уж пошла такая пьянка... можно и так:
    Код:
    Rnd=CreateObject("MSScriptControl.ScriptControl"); 
    Rnd.Language="VBscript"; 
    Rnd.ExecuteStatement("randomize");   
    Сообщить(Rnd.Eval("rnd")); 
    
    
  6. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    ну да..Вставлю свои пять копеек..всё, конечно, зависит от задачи.. для увеличения разброса значений для методов опирающихся на перформанскаунтер использовал искуственную паузу.. у меня это выглядело так..

    Код:
    Procedure ВызватьЗадержку() 
    BegCnt=_GetPerformanceCounter();
    While _GetPerformanceCounter()-BegCnt<15 Do
    A = 2+2;
    EndDo;
    EndProcedure
    
    
    а вот кусочек функции в которой использовалось.. подбор случайного промежутка времени
    Код:
    Procedure Генерировать()
    ...
    a1 = _GetPerformanceCounter()%(60+1);
    ВызватьЗадержку();
    a2 = _GetPerformanceCounter()%(120+1);
    ВызватьЗадержку();
    a3 = _GetPerformanceCounter()%(42);
    
    //случайное время между поездками от 0,5 до 2 (в конце дня минимальное значение)
    If ПлГрафик = 1 Then
    ПромежуточноеВремя = ?(ВремяНачала+ВсегоВремениЗаДень<17,Round(Max(30,a1,a3)/60,2),Round(Min(10,a1,a3)/60,2))/2;
    Else
    ПромежуточноеВремя = ?(ВремяНачала+ВсегоВремениЗаДень<17,Round(Max(30,a1,a2,a3)/60,2),Round(Min(15,a1,a2,a3)/60,2));
    EndIf;
    ...
    EndProcedure
    
  7. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Организовывать задержку через чикл.... Не есть хорого. Точнее совсем плохо.
    А так - идея достойная
  8. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    а как по другому? :)
  9. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Обычно я использую метод Sleep объекта WScript. Останавливает текущий процесс без загрузки процессора. Если хочу наоборот блокировать работу ВСЕХ - применяю метод
    Timeout - вызывает 100% загрузку процессора на указанное время.

Поделиться этой страницей