Книга знаний

1С:Предприятие / Приемы программирования

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

Подборка алгоритмов для генерации случайных чисел и перемешивания.Автор статьи: Волшебник | Редакторы: acsent,
Последняя редакция №5 от 13.01.06 | История
URL: http://kb.mista.ru/article.php?id=25

Перем глСлучайноеЧисло Экспорт; 

Функция глРанд(От=0,До=1,Шаг=0,Парам=0) Экспорт 

 Если Парам<>0 Тогда 
  глСлучайноеЧисло=Парам; 
 КонецЕсли; 

 Если Число(глСлучайноеЧисло)=0 Тогда 
  глСлучайноеЧисло=Число(СтрЗаменить(""+ТекущееВремя(),":","")); 
  глСлучайноеЧисло=(16807*глСлучайноеЧисло)%2147483647; 
 КонецЕсли; 
 
 глСлучайноеЧисло=(16807*глСлучайноеЧисло)%2147483647; 
 глСлучайноеЧисло=макс(глСлучайноеЧисло,-глСлучайноеЧисло); 
 СлЕд=глСлучайноеЧисло/2147483647; 
 СлВыб=СлЕд*(До-От)+От; 

 Если Шаг>0 Тогда 
  СлВыб=От+Окр((СлВыб-От)/Шаг)*Шаг; 
 КонецЕсли; 

 Возврат(СлВыб); 
КонецФункции  


-------------------------------------

http://www.sinor.ru/~my1c/knowhow/rand.html

-------------------------------------

randSeed=ranseed%100000000001; 
randSeed=randSeed*1103515245+12345; 

и проблемы со скоростью снимаются...  

randSeed=randseed%100000000001; 

а так? ;-)

-------------------------------------
Премешать N чисел:

Для а=1 по N цикл 
 массив[а]=а; 
Конеццикла; 
Для а=1 по N-1 цикл 
 Сл=Случ(а,N);// Целое случайное число в интервале [а..N] 
 К=массив[а]; 
 массив[а]=массив[Сл]; 
 массив[Сл]=К; 
КонецЦикла; 


-------------------------------------

Sc    =    CreateObject("MSScriptControl.ScriptControl"); 
Sc.language    =    "VBscript"; 
sc.executeStatement("randomize");   
оноВотТутаБудет=Sc.eval("rnd"); 


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

Ранд=_GetPerformanceCounter()%(100+1); 

похоже это лучшеее  

-------------------------------------

Библиотека мат. функций, где есть генератор сл. чисел:
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=92&lid=2688

-------------------------------------

В 8.0 для получения случайных чисел можно использовать встроенный генератор GUID.
Вот пример простенькой функции:

Функция ПолучитьСлучайноеЧисло(Мин,Макс)
    
    //вместо Ranodmize
    Для н = 1 По 100 Цикл
        Уник = Новый УникальныйИдентификатор;
    КонецЦикла; 
    
    Уник = СокрЛП(Новый УникальныйИдентификатор);
    Уник = СтрЗаменить(Уник,"-","");
    Уник = СтрЗаменить(Уник,"a","");
    Уник = СтрЗаменить(Уник,"b","");
    Уник = СтрЗаменить(Уник,"c","");
    Уник = СтрЗаменить(Уник,"d","");
    Уник = СтрЗаменить(Уник,"e","");
    Уник = СтрЗаменить(Уник,"f","");
    
    Уник = Число(Уник);
    Знаменатель = 10;
    Для н = 2 По (СтрДлина(СтрЗаменить(Уник,Символы.НПП,""))) Цикл
        Знаменатель = Знаменатель * 10;
    КонецЦикла; 
    
    Случ = Уник / Знаменатель;
    ЧислоИзИнтервала = Мин(Макс(Окр(Мин + (Макс-Мин)*Случ),Мин),Макс);
    
    Возврат ЧислоИзИнтервала;

КонецФункции 

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика